Конструктор 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 ответа:
Во втором случае компилятор получает инструкции по созданию объекта один раз. В первом случае вы просите создать временный объект, который затем копируется в новый объект. В этом случае компилятор может решить заменить создание-копирование-уничтожение на более эффективное создание одного объекта. Поэтому вы должны быть готовы к такой возможности, но вы не можете полагаться на нее.
=
в объявлении не является присваиванием. Оператор присваивания не вызывается. На 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; };