簡體   English   中英

關於C ++中的復制構造函數的困惑

[英]Confusion about Copy Constructor in C++

碼:

class A 
{
public:
    A()
    {
        cout<<"Defualt Constructor"<<endl;
    }

    A(A &t) 
    { 
        cout<<"Copy Constructor"<<endl;
    }
};

A func()
{
    cout<<"In func"<<endl;
}

int main()
{
    A a1;
    A a2;
    a2 = func();
    return 0;
}

該程序工作正常。 另外,如果我這樣調用函數:

A a2 = func();

並在復制 構造函數參數中添加const限定符,例如:

A(const A &t) 
{ 
    cout<<"Copy Constructor"<<endl;
}

此外,工作正常。

但是,如果從復制構造函數參數中刪除const ,例如:

A(A &t) 
{ 
   cout<<"Copy Constructor"<<endl;
}

並調用函數func()

A a2 = func();

編譯器給出錯誤:

error: invalid initialization of non-const reference of type 'A&' from an rvalue of type 'A'
      A a2 = func();
                 ^
prog.cpp:13:9: note:   initializing argument 1 of 'A::A(A&)'
         A(A &t) 
         ^

為什么在最后一種情況下編譯器會給出錯誤?

A a2 = func(); 復制初始化a2將通過func()返回的對象通過復制構造func()進行初始化。 func()按值返回,所以它返回的是臨時值,不能綁定到非常量的左值引用(即A & ),這就是為什么會出現錯誤。

臨時可以綁定到const左值引用(或右值引用),因此將參數類型更改為const A &t (或添加move構造函數)將使其工作正常。

順便說一句: a2 = func(); 與副本構造函數無關,但與副本分配運算符無關。 您沒有為A聲明它,而隱式聲明的副本賦值運算符const A&作為參數,那么就可以了。

BTW2: func()返回任何內容。 請注意, 從非void函數的末尾流出而不返回 UB。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM