Object v1(1);
// Construct(1)
Обычный вызов конструктора для автоматической переменной стека (уничтожается в конце функции).
cout << "( a )" << endl;
// ( a )
Object v2(2);
// Construct(2)
Еще один вызов конструктора.
v2 = v1;
// 2 = 1
Оператор присваивания вызван, потому что v2 уже был создан (мы вызвали конструктор для него), и теперь мы присваиваем один существующий объект другому.
cout << "( b )" << endl;
// ( b )
Object v4 = v1;
// Copy-construct(1)
Здесь вызывается конструктор копирования, поскольку объект v4 все еще не создан, поэтому мы создаем его как копию v1. Задание берется здесь, чтобы означать то же самое, как если бы вы сделали Object v4(v1)
Object *pv5;
pv5 = &v1;
pv5 = new Object(5);
// Construct(5)
Вызовите конструктор для объекта кучи (уничтожается явно с помощью delete
).
cout << "( c )" << endl;
// ( c )
func(v1);
// Copy-construct(1) <br />
// Copy-construct(1) <br />
// Destruct(1) <br />
// Destruct(1) <br />
Сначала вызывается конструктор копирования для копирования v1 в параметр var. Он вызывается снова, чтобы создать копию var в качестве возвращаемого значения для вызывающей стороны. var уничтожается, поскольку он выталкивается из стека при выходе из функции. Возвращаемое значение уничтожается после выражения func (v1).
cout << "( d )" << endl;
// ( d )
delete pv5;
// Destruct(5)
Объект, на который указывает pv5, уничтожается вручную.
} // end of main
// Destruct(1) <br />
// Destruct(1) <br />
// Destruct(1) <br />
Автоматические переменные v1, v2, v4 (все скопировавшие идентификатор v1 из конструкции присваивания или копирования) извлекаются из стека, и для каждого вызывается деструктор.