Следующий код дает другое количество деструкторов при компиляции в GCC и vc9. AFAIK при запуске на vc9 я получаю 5 деструкторов, которые я понимаю. Вызван оператор + перегружен, и два объекта создаются, когда возвращается временный объект. Это позволяет уничтожить 3 объекта. Когда вызывается перегруженный оператор =, создается один объект, а при возвращении снова временный. Это суммирует до пяти разрушений, не считая трех объектов, созданных в начале main.
Но когда я компилирую в 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;
}