Давайте играть шоу и сказать, так что давайте инструмент всем специальным членам:
#include <iostream>
class abc{
public:
int a, b;
abc()
{ std::cout << "Default constructor\n"; a = 0; b = 0;}
abc(int x)
{ std::cout << "Int constructor\n"; a = x;}
abc(abc const& other): a(other.a), b(other.b)
{ std::cout << "Copy constructor (" << a << ", " << b << ")\n"; }
abc& operator=(abc const& other) {
std::cout << "Assignment operator (" << a << ", " << b << ") = (" << other.a << ", " << other.b << ")\n";
a = other.a;
b = other.b;
return *this;
}
~abc()
{std::cout << "Destructor Called\n";}
};
int main()
{
abc obj1;
std::cout << "OBJ1 " << obj1.a << "..." << obj1.b << "\n";
abc obj2;
std::cout << "OBJ2 " << obj2.a << "..." << obj2.b << "\n";
obj2 = 100;
std::cout << "OBJ2 " << obj2.a << "\n";
return 0;
}
И мы получаем this output:
Default constructor
OBJ1 0...0
Default constructor
OBJ2 0...0
Int constructor
Assignment operator (0, 0) = (100, 0)
Destructor Called
OBJ2 100
Destructor Called
Destructor Called
Итак, давайте согласовать их с линейными источниками:
int main()
{
abc obj1;
// Default constructor
std::cout << "OBJ1 " << obj1.a << "..." << obj1.b << "\n";
// OBJ1 0...0
abc obj2;
// Default constructor
std::cout << "OBJ2 " << obj2.a << "..." << obj2.b << "\n";
// OBJ2 0...0
obj2 = 100;
// Int constructor
// Assignment operator (0, 0) = (100, 0)
// Destructor Called
std::cout << "OBJ2 " << obj2.a << "\n";
// OBJ2 100
return 0;
// Destructor Called
// Destructor Called
}
У вас в основном было все , давайте рассмотрим сюрпризы.
Первый сюрприз: хотя obj2
меняет значение позже abc obj2;
все равно вызовет конструктор по умолчанию в точке объявления.
Второй сюрприз: obj2 = 100
фактически означает obj2.operator=(abc(100));
, то есть:
- Построить временную (безымянным)
abc
от abc(100)
- Назначают его
obj2
- уничтожить временный, прежде чем перейти к следующему оператору
Третий сюрприз: деструкторы называются в конце o в объеме, непосредственно перед закрывающей скобкой }
(и да, послеreturn
). Поскольку вы используете system("pause")
, я предполагаю, что вы находитесь на Windows => хотя удача, которую они вызывают после завершения паузы, и, таким образом, ваша консоль Windows исчезает в мгновение ока в тот момент, когда они появятся. Вы можете запустить программу с более постоянной консоли или использовать дополнительную область:
int main() {
{
// your code here
}
system("pause");
return 0;
}
«первый экземпляр уничтожен и создается новый экземпляр, который заменяет оригинал» - это неправильно. Создается новый экземпляр, затем копируется в оригинал, затем временно (а не оригинал) уничтожается. Назначение копии действительно волшебным образом устанавливает оба поля в существующем объекте. –
@SteveJessop: Хороший звонок –