C++複製構造函數的詭異行爲研究

        C++ Primer(4 edition) 中文版P407上說:“複製初始化首先使用指定構造函數創建一個臨時對象,然後用複製構造函數將那個臨時對象複製到正在創建的對象。”但我的實驗結果顯示是沒有調用複製構造函數。

        我做了個實驗(實驗1),首先寫了一個簡單的類,裏面提供一個默認構造函數,一個接受單個形參的構造函數,一個複製構造函數和一個=重載函數,在上面每個函數中都打印一個消息,提示這個函數正在被調用。

        接着在主函數使用這個類,使用複製初始化這個類的對象。按照書上說的,顯示結果應該是先調用單形參的構造函數創建臨時對象,輸出一個提示,然後調用複製構造函數,輸出一個提示。但結果只有一個提示!顯示的是只調用了單形參的構造函數直接創建了對象,並沒有臨時對象的存在。結果很詭異!

        既然沒有調用複製構造函數,我又做了個實驗(實驗2),把這個複製構造函數改成private的,其他地方沒有變,做了同樣的實驗,編譯就不通過了,錯誤提示是我的主函數調用了複製構造函數。結果是不是很詭異?

        問題:C++在複製初始化的時候到底有沒有創建臨時對象?如果有,爲什麼會出現實驗1的結果;如果沒有爲什麼出現實驗2的結果?

        實驗1的類定義代碼如下:

class Employee
{
public:
    Employee();
    Employee(std::string sname);
    // copy constructor
    Employee(const Employee &old);
    Employee& operator=(const Employee&old);
 
    int getID() const { return id; }
    std::string getName() const { return name;}
 
private:
    static int newid;
    int id;
    std::string name;
};

        實驗2的類定義代碼如下:

class Employee
{
public:
    Employee();
    Employee(std::string sname);
    Employee& operator=(const Employee&old);
 
    int getID() const { return id; }
    std::string getName() const { return name;}
 
private:
    // copy constructor
    Employee(const Employee &old);
    static int newid;
    intid;
    std::string name;
};

        實驗的類實現代碼如下:

int Employee::newid =1;
 
Employee::Employee(): id(newid)
{
    std::cout << "In defaultconstructor, id = " << id << std::endl;
    ++newid;
}
 
Employee::Employee(std::stringsname) : id(newid), name(sname)
{
    std::cout << "In singleparameter constructor, id = " << id << std::endl;
    ++newid;
}
// copy constructor
Employee::Employee(constEmployee &old) : id(newid), name(old.getName())
{
    std::cout << "In copy constructor,id = " << id << std::endl;
    ++newid;
}
 
Employee&Employee::operator=(const Employee &old)
{
    std::cout << "In aissignfunction, id = " << id << std::endl;
    name = old.getName();
    return *this;
}

        主函數使用類的代碼如下:

int main()
{
    string name = "adu";
    Employee em5 = name;
 
    return 0;
}

        實驗1結果:

In single parameterconstructor, id = 1

        實驗2結果:

error:‘Employee::Employee(const Employee&)’ is private

        問題發在CSDN論壇上,歡迎大家一起探討。





























發佈了30 篇原創文章 · 獲贊 66 · 訪問量 65萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章