一時的な戻りオブジェクトがすぐに別のオブジェクトに割り当てられると、コピーコンストラクタが呼び出されますか

ニレイ

このコードの出力が次のようにどのように出力されるかを理解するのに問題があります。

#include<iostream>
using namespace std;

class three_d
{float x,y,z;
public:
    three_d(){x=y=z=0;cout<<"\n\tDefault Constructor";}
    three_d(float a,float b,float c){x=a;y=b;z=c;cout<<"\n\tOverloaded Constructor";}
    three_d(const three_d &obj){x=obj.x;y=obj.y;z=obj.z;cout<<"\n\tCopy Constructor";}
    three_d operator+(three_d op2);
    three_d operator=(three_d op2);
    void show();
    ~three_d(){cout<<"\n\tDestructor Working !!";}
};

three_d three_d::operator+(three_d op2)
{
    x=x+op2.x;
    y=y+op2.y;
    z=z+op2.z;
    return *this; 
}

three_d three_d::operator=(three_d op1)
{
    x=op1.x;
    y=op1.y;
    z=op1.z;
    return *this;
}

void three_d::show()
{
    cout<<"\n\n\tValues are : x="<<x<<" y="<<y<<" and z="<<z<<"\n";
}

int main()
{
    three_d ob1(2.1,2,2.2);
    three_d ob2(1,1,1), ob3;
    ob3=ob1+ob2;
    ob1.show();
    ob2.show();
    ob3.show();

    return 0;
}

出力は次のようになります。

1. Overloaded Constructor 
2. Overloaded Constructor
3. Default Constructor
4. Copy Constructor
5. Copy Constructor
6. Destructor Working !!
7. Copy Constructor
8. Destructor Working !!
9. Destructor Working !!
10. Values are : x=3.1 y=3 and z=3.2
11. Values are : x=1 y=1 and z=1
12. Values are : x=3.1 y=3 and z=3.2
13. Destructor Working !!
14. Destructor Working !!
15. Destructor Working !!

だから私の質問は:

  • 出力の5行目で、このコピーコンストラクターは何のためにありますか?*このポインタ用ですか(ただし、ポインタなので、コピーコンストラクタが必要だとは思いません)?4行目はオブジェクトop2用です(私は推測します)?
  • "="をオーバーロードするときに上記のステートメントが真である場合、コピーコンストラクターが1つだけ使用されるのはなぜですか(戻り値もある場合は?
  • 一時(戻り)オブジェクトはいつ破棄されますか?
  • このように出力の順序を説明してください。
  • オーバーロードされた「+」を次のようなものに変更しても:

    three_d three_d :: operator +(three_d op2)
    {three_d temp;
    temp.x = x + op2.x;
    temp.y = y + op2.y;
    temp.z = z + op2.z;
    温度を返す;
    }

"="のコピーコンストラクターの出力は同じままです(値は変更されます)。つまり、 "="のコピーコンストラクターは1つだけです。ただし、op1オブジェクトの場合は "=" 1、* thisの場合はその他のコピーコンストラクターが2つ必要だと思います。

mainで次のような単純な割り当てを使用する場合:
ob3 = ob1;
コピーコンストラクターは、期待どおりに2回呼び出されます。
説明してください。

フレドリックガウス

ステートメントを理解するための最良の方法、私はあなたがそれを次のように見るべきだと思います。

ob3.operator =(ob1.operator +(ob2));

4. Copy Constructor値でob2呼び出すため、これはから一時オブジェクトを作成operator+しています。これを一時的なtmp2と呼びましょう

5. Copy Constructor:値でob1戻ってきoperator+ため、これは一時オブジェクトを作成していますこれを一時tmp1と呼びましょう

6. Destructor Working !!operator+終了すると、一時オブジェクトtmp2が破棄されます。

-->Important note hereVC++GCCコンパイラ興味深いことに、一時的なオブジェクトを通過TMP1から返さoperator+operator=参照することによってもoperator=値(コピー)することにより、入力をとります。これが、ここに別のコピーコンストラクターが表示されない理由です。[これは専門家による説明が必要です]

7. Copy Constructor:これはから別の一時的なものを作成していますob3operator=値で戻るからです。この最後の一時的なtmp3と呼びましょう

8. Destructor Working !!operator+終了すると、tmp1破棄されます。

9. Destructor Working !!次の場合にoperator+終了し、tmp3割り当ての最後に破壊されます。コンパイラ

の結果を見るGCCと、次のようになっています。

4.コピーコンストラクタ
5.コピーコンストラクタ
6.コピーコンストラクタ
7.デストラクタが機能しています!!
8.デストラクタ作業!!
9.デストラクタ作業!!

そして、私が行った同様の分析は次のとおりです。

  1. tmp2の作成
  2. tmp1の作成
  3. tmp3の作成
  4. tmp3破壊
  5. tmp1破壊
  6. tmp2破壊

注:私たちは、あなたが定義する真の方法を知っていると仮定されているoperator+operator=署名とを(1友達機能2定数のparamersを取っている、など参照によって返す他)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ