复制构造函数叫额外

时间:2013-05-31 20:14:37

标签: c++ constructor copy-constructor

我有一个显示奇怪行为的程序

#include <cstdlib>
#include <iostream>

using namespace std;
class man{
           int i ;
      public:
           man(){
             i=23;
             cout << "\n defaul constructir called\t"<< i<<"\n";
           }
           man (const man & X) {
               i = 24;
           cout << "\n COPY constructir called\t"<< i<<"\n";
           }       
           man &  operator = (man x ) {
               i = 25;
               cout << "\n = operator  called\t"<< i<<"\n"; 
               return *this;
           }      
      };

int main(int argc, char *argv[])
{

     man x;
     cout <<"\n ----------\n";
     man y = x;
     cout <<"\n ----------\n";
     x=y;


    return 0;
}

中显示的输出
 defaul constructir called  23

 ----------

 COPY constructir called    24

 ----------

 COPY constructir called    24

 = operator  called 25

对于x = y的第三次调用,此输出很奇怪;

为什么在我没有制作新对象但使用旧对象时,会调用复制构造器的额外打印件。

是否因为两者之间存在临时对象,如果是,我可以在这里阻止它们......

2 个答案:

答案 0 :(得分:12)

因为赋值运算符按值获取其参数。你可以通过const引用来获取它。

答案 1 :(得分:3)

man& operator =(man x);

您的参数通过 - value 获取其参数,当发生这种情况时,它将调用copy-constructor。这就是造成额外不必要的电话的原因。通过引用传递你的参数将避免复制,但是你将无法传递临时值(通常称为rvalues):

struct man
{
    man& operator =(man& x) { return *this; };
};

int main()
{
    man a, b;

    a = b;     // works
    a = man(); // error: no viable overloaded '=',
               // expected an l-value for 1st argument
}

通过引用传递给 const 将允许左值和右值的复制构造:

man& operator =(man const& x);
//                  ^^^^^