次のコードは、GCC と vc9 でコンパイルすると、異なる数のデストラクタを示します。私の知る限り、vc9 で実行すると、5 つのデストラクタが表示されますが、これは理解できます。+ オーバーロードされた演算子が呼び出され、一時オブジェクトが作成されると、2 つのオブジェクトが作成されます。これにより、3 つのオブジェクトの破壊が可能になります。オーバーロードされた = 演算子が呼び出されると、1 つのオブジェクトが作成され、返されるときに再び一時的なオブジェクトが作成されます。これにより、main の開始時に作成された 3 つのオブジェクトを数えずに、合計で 5 つの destruct になります。
しかし、GCC でコンパイルすると 3 になります。
関数が終了して返されたときに一時オブジェクトが作成されていないと推測するのはなぜですか? またはコンパイラ間の異なる動作についての質問。私は単に知りません、そしていくつかの明確化がいいでしょう。
#include <iostream>
using namespace std;
class planetCord {
double x, y, z;
public:
planetCord() { x = y = z = 0; }
planetCord(double j, double i, double k) { x = j; y = i; z = k; }
~planetCord() { cout << "destructing\n"; }
planetCord operator+(planetCord obj);
planetCord operator=(planetCord obj);
void show();
};
planetCord planetCord::operator +(planetCord obj) {
planetCord temp;
temp.x = x + obj.x;
temp.y = y + obj.y;
temp.z = z + obj.z;
return temp;
}
planetCord planetCord::operator =(planetCord obj) {
x = obj.x;
y = obj.y;
z = obj.z;
return *this;
}
void planetCord::show() {
cout << "x cordinates: " << x << "\n";
cout << "y cordinates: " << y << "\n";
cout << "z cordinates: " << z << "\n\n";
}
int main() {
planetCord jupiter(10, 20, 30);
planetCord saturn(50, 100, 200);
planetCord somewhereDark;
jupiter.show();
saturn.show();
somewhereDark.show();
somewhereDark = jupiter + saturn;
jupiter.show();
saturn.show();
somewhereDark.show();
return 0;
}