このコードの出力が次のようにどのように出力されるかを理解するのに問題があります。
#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 !!
だから私の質問は:
オーバーロードされた「+」を次のようなものに変更しても:
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 here
:VC++
とGCC
コンパイラ興味深いことに、一時的なオブジェクトを通過TMP1から返さoperator+
をoperator=
参照することによってもoperator=
値(コピー)することにより、入力をとります。これが、ここに別のコピーコンストラクターが表示されない理由です。[これは専門家による説明が必要です]
7. Copy Constructor
:これはから別の一時的なものを作成していますob3
operator=
値で戻るからです。この最後の一時的なtmp3と呼びましょう。
8. Destructor Working !!
:operator+
終了すると、tmp1
破棄されます。
9. Destructor Working !!
次の場合にoperator+
終了し、tmp3
割り当ての最後に破壊されます。コンパイラ
の結果を見るGCC
と、次のようになっています。
4.コピーコンストラクタ
5.コピーコンストラクタ
6.コピーコンストラクタ
7.デストラクタが機能しています!!
8.デストラクタ作業!!
9.デストラクタ作業!!
そして、私が行った同様の分析は次のとおりです。
- tmp2の作成
- tmp1の作成
- tmp3の作成
- tmp3破壊
- tmp1破壊
- tmp2破壊
注:私たちは、あなたが定義する真の方法を知っていると仮定されているoperator+
とoperator=
署名とを(1友達機能2定数のparamersを取っている、など参照によって返す他)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加