C++下拷貝建構函式的引數型別必須是引用
阿新 • • 發佈:2019-01-23
摘自拷貝建構函式的引數型別必須是引用
在下面幾種情況下會呼叫拷貝建構函式:
1. 顯式或隱式地用同類型的一個物件來初始化另外一個物件。如上例中,用物件c初始化d;
2. 作為實參(argument)傳遞給一個函式。如CClass(const CClass c_class)中,就會呼叫CClass的拷貝建構函式;
3. 在函式體內返回一個物件時,也會呼叫返回值型別的拷貝建構函式;
4. 初始化序列容器中的元素時。比如 vector svec(5),string的預設建構函式和拷貝建構函式都會被呼叫;
5. 用列表的方式初始化陣列元素時。string a[] = {string(“hello”), string(“world”)}; 會呼叫string的拷貝建構函式。
#include "stdafx.h" #include <iostream> using namespace std; class Temp { public: Temp(); ~Temp(); //Temp(const Temp & temp); Temp(Temp temp); Temp& operator=(const Temp & temp); }; //Temp::Temp(const Temp & temp) //{ // cout << "CopyConstructor" << endl; //} Temp::Temp(const Temp temp) { cout << "CopyConstructor" << endl; } Temp::Temp() { cout << "DefaultConstructor" << endl; } Temp::~Temp() { cout << "DefaultDestructor" << endl; } Temp& Temp::operator=(const Temp& temp) { cout << "OverrideEqualOp" << endl; return *this; } int main() { Temp t,b; Temp a(t); Temp c = a; c = b; getchar(); return 0; }
此程式碼塊編譯會報錯
1. note: 由於複製建構函式不明確或沒有可用的複製建構函式,因此無法複製構造 class“Temp”
2. error C2558: class“Temp”: 沒有可用的複製建構函式或複製建構函式宣告為“explicit”
3. error C2440: “初始化”: 無法從“Temp”轉換為“Temp”
當使用引用傳遞時的時則編譯通過
後續會新增其他情形下的測試程式碼。
自感平時學的太亂,不成系統,幡然醒悟開始推部落格,請大神們多指導。