3

奇妙な動作を示すプログラムがあります

#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 の 3 回目の呼び出しでは奇妙です。

新しいオブジェクトを作成せずに古いオブジェクトを操作しているときに呼び出されるコピー コンストラクターの余分な出力があるのはなぜですか。

一時的なオブジェクトが間にあるためですか?はいの場合、ここで停止できますか....

4

2 に答える 2

12

代入演算子は引数を値で受け取るためです。代わりに const 参照で取得できます。

于 2013-05-31T20:15:46.113 に答える
3
man& operator =(man x);

あなたのパラメータはその引数をで取り、それが起こるとコピーコンストラクタを呼び出します。それが、余分な迷惑電話の原因です。引数を参照渡しするとコピーは回避されますが、一時値 (一般に右辺値と呼ばれます) を渡すことはできません。

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);
//                  ^^^^^
于 2013-05-31T21:08:43.640 に答える