2016-02-19 51 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

相关问题