2016-02-19 186 views
1

我有一個程序,使用+運算符重載添加兩個複數。該程序是:爲什麼我在明確寫入Copy構造函數後得到垃圾值?

#include<iostream> 
class Complex 
{ 
    int a, b; 
    public: 
    Complex() 
    { 
    std::cout<<"\n Normal constructor "; 
    } 
    void setData(int x, int y) 
    { 
    a = x; b = y; 
    } 
    void showData() 
    { 
    std::cout<<"a = "<<a<<std::endl<<"b = "<<b<<std::endl; 
    } 
    Complex operator + (Complex c) 
    { 
    Complex temp; 
    temp.a = a + c.a; 
    temp.b = b + c.b; 
    return temp; 
    } 
    Complex(Complex &z) 
    { 
    std::cout<<"\n The copy constructor is called "; 
    } 
}; 
int main() 
{ 
    Complex c1, c2, c3; 
    c1.setData(2, 3); 
    c2.setData(4, 5); 
    c3 = c1+c2; 
    c3.showData(); 
    return 0; 
} 

在這裏,當我不明確寫複製構造函數,然後該程序給出正確的輸出。但寫完拷貝構造函數後,輸出就是垃圾值,我想知道爲什麼程序會產生垃圾值?

輸出實例:

Normal constructor 
Normal constructor 
Normal constructor 
The copy constructor is called 
Normal constructor a = -1270468398 
b = 32769 

請告訴 「什麼c3 = c1+2;之後發生的事情是執行?」

+1

其他人已經回答了你的版本不起作用的原因。我會補充說,沒有它的原因是編譯器會嘗試默認生成一個,如果你不這樣做的話。而在這個特定的情況下,默認的就好了。 –

+0

另外,你爲什麼要用'c3 = c1.operator +(c2);'?來添加複數。是不是重載'+'操作符能夠寫入'c1 + c2'的重點? :) – Eutherpy

回答

4

您忘記複製複製構造函數中的成員。如果你自己寫,你必須這樣做。既然你沒有成員默認初始化,並在int這意味着沒有初始化發生,所以你有一個垃圾值。

你的拷貝構造函數應該是

Complex(const Complex &z) : a(z.a), b(z.b) 
{ 
    std::cout<<"\n The copy constructor is called "; 
} 

你也應該參加對象由const&複製,這樣就可以複製臨時對象。 Complex(Complex &z)將無法​​做到這一點。

+0

如果你知道獲取垃圾價值的原因是什麼,或者數據在什麼時候丟失,這個答案甚至會更好。 –

+1

@Ayushibhardwaj Is not that covered by *既然你沒有成員默認初始化,並且在'int'的情況下,這意味着沒有初始化發生,所以你有一個垃圾值。* – NathanOliver

+0

你可以告訴發生了什麼後,c3 = C1 + 2;執行? –

2

您沒有初始化複製構造函數中的成員數據。

添加代碼以初始化成員。

Complex(Complex &z) : a(z.a), b(z.b) 
{ 
    std::cout<<"\n The copy constructor is called "; 
} 

此外,您應該使類型爲const&的複製構造的參數。經過c2operator +

Complex(Complex const& z) : a(z.a), b(z.b) 
{ 
    std::cout<<"\n The copy constructor is called "; 
} 
1

你的拷貝構造函數被調用。

有兩種選擇,以解決您的問題(但兩者本來也應該修正):

operator+應該採取一個const引用,而不是對象的副本:

Complex operator + (const Complex &c) 

你的拷貝構造函數應該真正複製對象(除了以const參考爲參數):

Complex(const Complex &z) : a (z.a), b(z.b) 

還有一些其他的意見可以在您的代碼

  • 第一,我希望它只是一個鍛鍊,因爲std::complex存在
  • 默認的構造函數應該初始化成員
  • setData/showData似乎是錯誤的,你應該有有意義的訪問器隱藏你的內部(一個複雜的可由實部/虛部表示,還有模塊/參數等。)
  • showData應該是常量(它不修改對象,它應該是一個const對象上調用)

我希望這有助於。

0

就你而言,由於你沒有任何想要執行深層複製的指針,編譯器生成的複製構造函數就足夠了。

更多可讀性,套內版本> = C++ 11,你可以用它來明確

Complex(Complex const&) = default; 

要回答你的問題,會發生什麼時, 「C3 = C1 + C2;」

功能「運營商+」將C1對象調用,所以這裏C2將被複制到帕拉姆「複雜的C」。所以,你會得到一個名爲拷貝構造函數

是這樣的可視化

Comlex operator+(Complex c(c2)/* copy constructor is called here*/) 
{ 
    ... 
    return temp. 
} 

然後調用operator =函數並將temp分配給C3。如果你超載operator =,你可以看到對它的調用

+0

這很好,但沒有回答爲什麼OP的一個不工作。 – NathanOliver

相關問題