2013-02-11 5 views
2

Я спросил в области чата stackoverflow следующий вопрос.Конструктор C++ Object obj = Object ("string", 22); создание временного объекта?

Если вы создаете свой объект, как это, он создает временное и затем вызывает оператор присваивания для назначения темпа объекту 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; 
}; 
+0

Копия может быть опущена компилятором, но это зависит от компилятора и используются опции , Что вы используете? –

+0

Visual Studio 2012 Express для рабочего стола – EddieV223

+0

Вы строите отладку или выпуск? –

ответ

2

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

0

= в декларации не является назначением. Оператор присваивания не запускается. Учебник C++ - хорошая вещь.

0

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

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; 
}; 
Смежные вопросы