class fruit{
public:
fruit(const fruit &f){
cout << "copy constructor invoked ";
}
~fruit(){
cout << "destructor invoked ";
}
fruit(){
cout << "constructor invoked ";
}
}
int main(){
fruit f1; // o/p constructor invoked
fruit f = fruit(); // o/p constructor invoked
fruit(); // o/p constructor invoked and destructor invoked
fruit f2 = fruit(fruit(fruit(f1))); // can anyone explain this statement?
// o/p copy constructor invoked
return 0; // o/p destructor invoked destuctor invoked
}
Я узнал, что fruit f = fruit()
fruit()
создает временный объект и назначает его f
с помощью конструктора копирования. Мои вопросы:
fruit()
создает временный объект, тогда деструктор должен вызываться дважды, но деструктор вызывается только один раз, т.е. Для f
f
с помощью конструктора копирования, здесь он вообще не вызывает конструктор копирования.? (компилятор сгенерирует другой экземпляр для внутренних копий для копирования временных объектов?) Если понятие о создании временных объектов, то выражение fruit f2 = fruit(fruit(fruit(f1)))
не вызывает никаких конструкторов и деструкторов, оно вызывает только конструктор копирования.
Как работает оператор, когда X x = X();
Я понимаю, как это работает, если это X x(x)
.
fruit f2 = fruit(fruit(fruit(f1)));
Я думаю, что этот оптимизирован вашим компилятором для фруктов f2 = fruit (f1); потому что компилятор замечает, что вы делаете копию (временной) копии (временной) копии и что результат в результате совпадает с одним экземпляром.
Изменение: удалил оператор, который обсуждался в комментариях
fruit(2)
(и даже если бы он был, он не скомпилировался) !!!