2013-07-31 11 views
1

我對以下代碼有兩個問題。非參數化和複製構造函數

首先

是什麼CASE1 CASE2和區別?由於缺少非參數構造函數,我可以看到CASE2無法編譯。爲什麼CASE1編譯?

是什麼CASE3和CASE4之間的區別?爲什麼複製構造函數或賦值運算符被調用?據this教程實例化一個對象,並從 用值初始化它的另一個對象

這是在這種情況下究竟會發生什麼,當拷貝構造函數被調用

。請注意,

CComplexNumber e = c;

在概念上與CASE3相同,但這裏調用了複製構造函數。

#include <iostream> 
using namespace std; 

class CComplexNumber { 
    float m_realPart; 
    float m_imagPart; 
public: 
    CComplexNumber(float real, float imaginary) : m_realPart(real), m_imagPart(imaginary) { 
     cout<<"Constructor called"<<endl; 
    } 
    CComplexNumber(const CComplexNumber & copy) { 
     cout<<"Copy constructor called"<<endl; 
     this->m_realPart=copy.m_realPart; 
     this->m_imagPart=copy.m_imagPart; 
    } 

    CComplexNumber& operator=(const CComplexNumber& rhs){ 
     cout<<"Assignment operator called"<<endl; 
     this->m_realPart=rhs.m_realPart; 
     this->m_imagPart=rhs.m_imagPart; 
     return *this; 
    } 

    friend ostream& operator<<(ostream& out,const CComplexNumber& rhs){ 
     out<<"["<<rhs.m_realPart<<","<<rhs.m_imagPart<<"]"; 
     return out; 
    } 
}; 

int main() { 
    CComplexNumber a(); //CASE1 
    //CComplexNumber b; //CASE2 

    CComplexNumber c=CComplexNumber(3,4); //CASE3 
    CComplexNumber d(CComplexNumber(5,6));//CASE4 

    cout<<a<<"|"<<c<<"|"<<d<<"|"<<endl; 
    return 0; 
} 

輸出

Constructor called 
Constructor called 
1|[3,4]|[5,6]| 

回答

2
CComplexNumber a(); //CASE1 

這不是一個對象創建。這是一個函數聲明。您正在聲明一個名爲a的函數,它不帶參數並返回CComplexNumber

至於其餘的,它被稱爲copy elision。即使這些調用會產生副作用,編譯器也可以免除對複製構造函數的不必要調用。

+0

我相信CASE2不會編譯,因爲默認構造函數尚未實現,並且由於其他構造函數而未隱式生成。 – maditya

+0

@maditya:是的,但我認爲OP知道這一點。非參數構造函數是他說默認構造函數的奇特方式。 –

+0

爲什麼「cout << a」行打印出「1」? – Slazer