为什么要有这玩意
谁知道
定义
复制构造函数,也是构造函数,所以定义的方式相似
标志是,它的第一个参数必须是类的引用,或者类的const引用
不存在重载,即使写了多个复制构造函数,最后被调用的只有一个
默认的复制构造函数,与赋值语句一样,都是值拷贝
#include <iostream>
#include <stdio.h>
using namespace std;
class Person {
public:
// 三种方式,推荐前二种
// 1. 推荐,存在唯一的const Person &
Person(const Person & person) {
cout << "Person1" << endl;
};
// 如果两种方式同时存在,会调用没有const的版本
// 2. 推荐,存在唯一的Person &
Person(Person & person) {
cout << "Person2" << endl;
};
// 3. 不推荐,这个依然是复制构造函数,诡异。与第二种方法存在二义性
// Person(Person & person, int i = 0) {
// cout << "Person3" << endl;
// };
// 无参构造函数
Person() {
}
~Person() {
cout << "~Person" << endl;
}
};
int main() {
Person p1; // 调用无参的构造函数,当你定义复制构造函数时,无参构造函数就需要自己定义了
// 主动调用方式有两种,推荐第一种
Person p2(p1); // 推荐,调用复制构造函数
Person p3 = p2; // 不推荐,还是调用复制构造函数
p2 = p1; // 赋值,把p1中得值拷贝到p2中,只是值拷贝,不会调用复制构造函数。
return 0;
}
调用复制构造函数的三种情况
主动调用
// 主动调用方式有两种,推荐第一种
Person p2(p1); // 推荐,调用复制构造函数
Person p3 = p2; // 不推荐,还是调用复制构造函数
传参调用
// 函数,需要一个Person类型的参数,不能是指针或引用
void print(Person person) {
// ...
}
int main() {
Person person;
print(person); // 调用复制构造函数
return 0;
}
返回值调用
有的地方说,下面这种方式会调用复制构造函数。在我的机器上没有出现。
Person getPerson() {
Person person;
printf("%p\n", &person);
return person;
}
int main() {
Person person = getPerson();
/* 两个地址,是一样的,而且并未调用析构函数,
说明getPerson函数返回的对象由person直接接收了,
不是说局部变量会被回收嘛,试试string也是一样的*/
printf("%p\n", &person);
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。