2016-11-07 150 views
0

我知道在創建基於現有對象的新對象時會調用複製構造函數。不過,我一直在試圖做同樣的事情,我發現複製構造函數沒有被調用。 以下是我的一段代碼:複製構造函數的調用

/* 
* class definition 
*/ 
class A 
{ 

    public: 
    A(int mn, int mx); //default constructor 
    A(A const& obj); //copy constructor 
    ~A(); 
    private: 
    int* ptr; 
    int max; 
    int min; 
} 

class B 
{ 
    public: 
     B(); 
     void print(); 
    private: 
     A m_aObject; 
} 


/* 
* B.cpp 
*/ 
void B::print() 
{ 
    A local_obj1(2,3); 
    local_obj1.ptr = Global_array; //some global array. 
    m_aObject = local_obj1; // should invoke the copy constructor 
} 


/* 
* A.cpp 
*/ 
A::A(A const& obj) 
{ 
    cout << "copy constr. invoked"<<endl; 
    ptr = new int[10]; 
    for(int i= 0; i< 10; i++) 
    ptr[i] = obj.ptr[i];  
} 

A::A(int mx, int mn) 
{ 
    min = mn; 
    max = mx; 
} 

按照鏈接[https://www.tutorialspoint.com/cplusplus/cpp_copy_constructor.htm],行m_aObject = local_obj1;必須調用拷貝構造函數。

但是我看到在執行上述語句之後,複製構造函數從不會被調用。複印件內的打印件。永遠不會顯示在控制檯上。

m_aObject = local_obj1;是否真的調用複製構造。 ?

如果我嘗試調用複製構造。通過m_aObject(local_obj1);, 它給出了編譯錯誤error: no match for call to '(A) (A&)'

是否有任何其他方式調用上述情況下的複製構造函數。

回答

2

=與類一起使用時可能發生兩件事。首先是複製構造和看起來像

type name = some_value; 

另一種是拷貝賦值,這時你有

name = some_value; 

正如你可以看到你的代碼看起來像這意味着你使用的是第二個例子賦值運算符而不是複製構造函數。請記住,只有在創建對象時才調用構造函數。之後,你只是複製/移動分配。

0

在你B類你有A級因爲這是B類施工過程中初始化成員。由於成員m_aObject已經被初始化爲(使用A的默認構造函數創建),所以複製構造函數將不會被調用。在你的情況下,使用淺拷貝調用默認賦值運算符。

  • 實例化一個對象和初始化它與來自另一對象的值:

    作爲參考時複製構造通常被稱爲。

  • 由值傳遞對象
  • 一個對象從一個函數由返回值