1. 程式人生 > >C++下拷貝建構函式的引數型別必須是引用

C++下拷貝建構函式的引數型別必須是引用

摘自拷貝建構函式的引數型別必須是引用
在下面幾種情況下會呼叫拷貝建構函式:
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”

當使用引用傳遞時的時則編譯通過
顯示結果

後續會新增其他情形下的測試程式碼。
自感平時學的太亂,不成系統,幡然醒悟開始推部落格,請大神們多指導。