2013-04-06 52 views
0

根據this question,當對象按值傳遞給另一個函數時,會調用一個拷貝構造函數。爲什麼按值傳遞一個對象即使該對象沒有拷貝構造函數也能工作?

我打消了我的拷貝構造函數的測試,但仍然可以按值傳遞。這有意義嗎?

我註釋掉拷貝構造函數:

/* 
Matrix4(const Matrix4<T>& m) 
{ 
    x.x = m.x.x; x.y = m.x.y; x.z = m.x.z; x.w = m.x.w; 
    y.x = m.y.x; y.y = m.y.y; y.z = m.y.z; y.w = m.y.w; 
    z.x = m.z.x; z.y = m.z.y; z.z = m.z.z; z.w = m.z.w; 
    w.x = m.w.x; w.y = m.w.y; w.z = m.w.z; w.w = m.w.w; 
} 
*/ 

typedef Matrix4<float> mat4; 

那麼這個編譯並運行良好:

void ttt(mat4 hi){ 

} 

void yyy(){ 
    mat4 x; 
    ttt(x); 
} 

因此,也許拷貝構造函數是不是在這種情況下叫什麼名字?這裏發生了什麼?

回答

3

如果不提供拷貝構造函數,編譯器生成一個對你來說,它被用來當你路過值(在C++ 11還有一招拷貝構造函數被調用在某些情況下可能)。爲了真正禁用它,你應該聲明它私有的,或者delete它在C++ 11:

class Foo 
{ 
private: 
    Foo(const Foo&); 
}; 

class Foo11 
{ 
public: 
    Foo(const Foo&) = delete; 
}; 
0

如果沒有指定的構造函數,C++創建一個無參數,並通過自身的拷貝構造函數。它只是執行對象的副本。

+0

C++不會生成任何東西,因爲它是一種抽象概念,一種編程語言。生成構造函數的東西是編譯器。 – 2013-04-06 06:44:43

+1

'執行對象的成員方式副本'是表達它的正常方式。有很多方法可以複製,編譯器生成的默認值可能不是正確的。 – john 2013-04-06 06:45:33

+0

@ H2CO3 C++強制編譯器生成構造函數:) – juanchopanza 2013-04-06 06:45:38

相關問題