Fruit () создает временный объект? при создании нового объекта

0
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 с помощью конструктора копирования. Мои вопросы:

  1. Если fruit() создает временный объект, тогда деструктор должен вызываться дважды, но деструктор вызывается только один раз, т.е. Для f
  2. Если он назначает временный объект f с помощью конструктора копирования, здесь он вообще не вызывает конструктор копирования.? (компилятор сгенерирует другой экземпляр для внутренних копий для копирования временных объектов?)

Если понятие о создании временных объектов, то выражение fruit f2 = fruit(fruit(fruit(f1))) не вызывает никаких конструкторов и деструкторов, оно вызывает только конструктор копирования.

Как работает оператор, когда X x = X(); Я понимаю, как это работает, если это X x(x).

  • 3
    Копия обычно удаляется, и объект создается на месте. Смотрите копию elision .
  • 0
    В вашем коде нет fruit(2) (и даже если бы он был, он не скомпилировался) !!!
Показать ещё 3 комментария
Теги:

1 ответ

-1
Лучший ответ
fruit f2 = fruit(fruit(fruit(f1))); 

Я думаю, что этот оптимизирован вашим компилятором для фруктов f2 = fruit (f1); потому что компилятор замечает, что вы делаете копию (временной) копии (временной) копии и что результат в результате совпадает с одним экземпляром.

Изменение: удалил оператор, который обсуждался в комментариях

  • 1
    Они не одинаковы. Исключение копирования возможно, и прежняя форма не может быть скомпилирована, если конструктор копирования недоступен.
  • 0
    Я попробовал это без конструктора копирования и фруктов f = fruit (); все еще скомпилировано.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню