為什麼要有這玩意
誰知道
定義
-
複製建構函式,也是建構函式,所以定義的方式相似
-
標誌是,它的第一個引數必須是類的引用,或者類的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
", &person);
return person;
}
int main() {
Person person = getPerson();
/* 兩個地址,是一樣的,而且並未呼叫解構函式,
說明getPerson函式返回的物件由person直接接收了,
不是說區域性變數會被回收嘛,試試string也是一樣的*/
printf("%p
", &person);
return 0;
}