C++的copy构造函数调用次数的问题
迷茫
迷茫 2017-04-17 12:09:21
0
1
739

原来在debug模式下也开了RVO,所以只调用了一次

class A {
public:
    A() {
        cout << "default constructor" << endl;
    }
    A(const A&) {
        cout << "A(const A&)" << endl;
    }
    A& operator=(const A&) {
        cout << "operator==" << endl;
        return *this;
    }
};

A getA() {
    A a;
    return a;
}

A& getAR() {
    A a;
    return a;
}

int main() {
    // A() -> A(const A&) -> A(const A&)
    cout << "getA()" << endl;
    A a = getA();
    // A() -> A(const A&)
    cout << "getAR()" << endl;
    A b = getAR();
    // A(const A&)
    cout << "Copy Test" << endl;
    A c = b;
}

主要疑问是第一个测试,我的想法是调用2次copy构造函数,一次是返回临时值的copy构造,还有一次是用返回的临时变量初始化a时候的copy构造,但为什么输出只有一次。
我在vs2015的debug模式下运行。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回覆(1)
Peter_Zhu

沒看到你的程式碼有驗證copy建構子的地方(例如 A b(a)這種),用的都是operator=的版本。

其二,這樣的程式碼很有問題:

A& getAR() {  
    A a;
    return a;
}

回傳值是一個引用,而它卻引用一個函數內的臨時物件a,一般情況下外面使用這個引用會導致程式直接崩潰,幸運的話,編譯器會幫做點什麼而不會崩潰。

A b = getAR();
這句程式碼的問題在於:你的意圖太模糊。如果你想建構一個全新的物件b,應該這樣寫:
A b(getAR());

如果你想建立一個引用,那麼你應該這樣寫:
A &b = getAR();
要保證getAR()回傳的是一個指向有效物件的引用,非函數內是臨時的,否則的話,如上所述,繼續使用b會導致崩潰。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板