2015-10-14 102 views
-2

我正在閱讀複製構造函數以及它們通常將參數作爲常量引用接收的方式。 Why should the copy constructor accept its parameter by reference in C++? 我寫了一段代碼片段來測試,當按值接收參數時,是否創建副本(如提供的鏈接的接受答案中所述)。 但是,當按值接收對象時,我看不到構造函數。 請解釋爲什麼?並且不是通過值返回對象時創建的副本?再也沒有構造函數在那裏調用。爲什麼?爲什麼構造函數在值傳遞時沒有被調用

class Vector 
{ 
    public: 
    Vector(){cout << "Vector constructor"<<endl;} 
    ~Vector(){cout << "Vector destructor"<<endl;} 

}; 
Vector use(Vector z) 
{ 
    cout << "At call" << endl; 
    Vector v; 
    cout << "after definition" << endl; 
    return v; 
} 
int main() 
{ 
    Vector t; 
    cout << "After irrelevant" << endl; 
use(t); 
cout << "After use"<< endl; 
} 

的輸出如下:

Vector constructor 
After irrelevant 
At call 
Vector constructor 
after definition 
Vector destructor 
Vector destructor 
After use 
Vector destructor 

UPDATE1:我已經錯過了最初的例子添加拷貝構造函數。一旦完成,代碼將按預期行事。

+4

你沒有拷貝構造函數。內置的不會打印任何東西;) –

+4

複製構造函數在通過值傳遞時調用,而不是正常的構造函數。 – owacoder

+0

我的不好,在同一個程序中有很多其他代碼..模擬它:)將添加並再次測試 –

回答

3

當對象按值傳遞時,複製(或移動)構造函數是不會調用默認構造函數。

如果我們追溯拷貝構造函數是這樣的:

class Vector 
{ 
    public: 
    Vector(){cout << "Vector constructor"<<endl;} 
    Vector(const Vector&) {cout << "Vector copy constructor"<<endl;} 
    ~Vector(){cout << "Vector destructor"<<endl;} 
}; 

然後,我們看到被調用構造函數:

Vector constructor 
After irrelevant 
Vector copy constructor //here 
At call 
Vector constructor 
after definition 
Vector destructor 
Vector destructor 
After use 
Vector destructor 

上有回報沒有副本,因爲副本是elided由編譯器爲了效率。如果您通過-fno-elide-constructors或與您的編譯器等效,那麼您將看到一個額外的副本。

+1

是的,剛剛測試過的變化,它的工作原理,但爲什麼不看到它在這裏的價值回報調用? –

+0

@HarishKulkarni這是由於複製elision。我添加了一些解釋。 – TartanLlama

0

複製被創建以傳遞該值,因此在那裏調用複製構造函數。

#include <iostream> 
using std::cout; 
using std::endl; 
class Vector 
{ 
    public: 
    Vector(){cout << "Vector constructor"<<endl;} 
    Vector(const Vector&){cout << "Vector copy constructor"<<endl;} // add this line 
    ~Vector(){cout << "Vector destructor"<<endl;} 

}; 
Vector use(Vector z) 
{ 
    cout << "At call" << endl; 
    Vector v; 
    cout << "after definition" << endl; 
    return v; 
} 
int main() 
{ 
    Vector t; 
    cout << "After irrelevant" << endl; 
    use(t); 
    cout << "After use"<< endl; 
} 

輸出:

Vector constructor 
After irrelevant 
Vector copy constructor 
At call 
Vector constructor 
after definition 
Vector destructor 
Vector destructor 
After use 
Vector destructor 
相關問題