C ++ создание объектов и конструктор - PullRequest
7 голосов
/ 08 января 2012

Я сейчас изучаю ctors и у меня есть несколько вопросов. На этих строках:

Foo obj(args);

Foo obj2;
obj2 = Foo(args);

Foo obj3 = Foo(args);

Первая часть : инициализирован только 1 конструктор (Foo) и obj. Итак, 1 создание объекта.

Вторая часть : создание временного объекта obj2 с вызовом для него ctor по умолчанию. В следующих строках мы создаем еще одну копию Foo и передаем ее копию в operator=(). Это правильно? Итак, 3 локальных временных объекта, 2 вызова конструктора.

Третья часть : создать 1 объект Foo и передать его копию в operator=(). Итак, 2 временных объекта и 1 вызов ctor.

Я правильно понимаю? И если это правда, компилятор (последний gcc, например) оптимизирует их в обычных случаях?

Ответы [ 3 ]

8 голосов
/ 08 января 2012

Сначала я прокомментирую третий:

Foo obj3=Foo(args);

Он не использует operator=, который называется назначением копирования. Вместо этого он вызывает конструктор копирования (теоретически). Здесь нет назначения. Таким образом, теоретически, существует два объекта создания, один временный и другой obj3. Компилятор может оптимизировать код, полностью исключая создание временного объекта.

Теперь второй:

Foo obj2;         //one object creation
obj = Foo(args);  //a temporary object creation on the RHS

Здесь в первой строке создается объект, вызывающий конструктор по умолчанию. Затем он вызывает operator=, передавая временный объект, созданный из выражения Foo(args). Таким образом, есть два объекта, только operator= принимает аргумент по ссылке const (что он и должен делать).

А в отношении первого вы правы.

3 голосов
/ 08 января 2012
  1. Да, Foo obj(args) создает один объект Foo и вызывает ctor один раз.

  2. obj2 не считается временным объектом.Но так же, как 1 Foo obj2 создает один объект и вызывает Foo ctor.Предполагая, что вы имели в виду obj2 = Foo(args) для следующей строки, эта строка создает один временный объект Foo и затем вызывает obj2.operator=().Таким образом, для этого второго примера есть только один временный объект, один не временный, Foo ctors вызывается дважды (один раз для невременного, один раз для временного) и оператор = () вызывается один раз.

  3. Нет, эта строка не вызывает operator=().Когда вы инициализируете obj3 с использованием синтаксиса =, это почти точно так же, как если бы вы использовали вместо этого круглые скобки: Foo obj3(Foo(args)); Таким образом, эта строка создает временный объект, а затем вызывает ctor-копию Foo для инициализации obj3 с использованием этого временного объекта.

2 голосов
/ 08 января 2012

Ваша терминология немного сбивает с толку.

Объекты obj, obj2 obj3 не называются "временными объектами".Только экземпляр, созданный в строке 3 перед назначением для obj, является временным объектом.

Кроме того, вы не создаете «копию Foo», вы создаете «экземпляр Foo» или «объект типа Foo».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...