Конструктор c++ Object obj = Object ("string", 22); создание временного объекта?


Я задал в чате stackoverflow следующий вопрос.

Если вы создаете свой объект таким образом, создает ли он временный, а затем вызывает оператор присваивания, чтобы назначить temp объекту obj?

Object obj = Object( "Chris", 27 );
Мне сказали, что он просто вызывает конструктор.

Однако, когда я запускаю код, консоль выводит, что dtor был вызван в самой следующей строке, что означает, что временный был построен, и это должно означать, что вызывается оператор присваивания слишком верно?

Итак, если это правда, то означает ли это, что написание ваших конструкторов так

Object obj( "Chris", 22 ); 

На самом деле работает намного быстрее, так как вы избегаете временного ctor и dtor, а также оператора присваивания. Когда я выполняю код, как описано выше, строка dtor не выводится на консоль до конца функции. Таким образом, кажется, что никакого Временного не было создано, и мой код будет работать более эффективно.

class Object
{
public:
Object()
     {
     mSize = 0;
     }
Object( string & name, int size )
     :
     mName(name),
     mSize(size)
     {
     }

~Object()
     {
     cout << "Object Dtor called" << endl;
     }
string mName;
int mSize;
};
3 2

3 ответа:

Во втором случае компилятор получает инструкции по созданию объекта один раз. В первом случае вы просите создать временный объект, который затем копируется в новый объект. В этом случае компилятор может решить заменить создание-копирование-уничтожение на более эффективное создание одного объекта. Поэтому вы должны быть готовы к такой возможности, но вы не можете полагаться на нее.

= в объявлении не является присваиванием. Оператор присваивания не вызывается. На C++ учебник является хорошая вещь, чтобы иметь.

Если вы просто обновите свой класс, чтобы вывести именно то, что он делает, то вы будете знать, например:

class Object
{
public:
Object()
     :
     mSize(0)
     {
     cout << "Object default Ctor called" << endl;
     }

Object(const Object & src )
     :
     mName(src.mName),
     mSize(src.mSize)
     {
     cout << "Object copy Ctor called" << endl;
     }

Object( string & name, int size )
     :
     mName(name),
     mSize(size)
     {
     cout << "Object name Ctor called" << endl;
     }

~Object()
     {
     cout << "Object Dtor called" << endl;
     }

Object& operator=(const Object &rhs)
    {
    cout << "Object Assigment Op called" << endl;
    mName = rhs.mName;
    mSize = rhs.mSize;
    }

string mName;
int mSize;
};