@qwaswedo

Почему происходит удаление объекта при конструировании одноименных объектов?

Столкнулся с интересной ситуацией при конструировании одноименных объектов класса без определенного оператора присваивания и явного конструктора с одним аргументом:
#include <iostream>

class A
{
public:
	A(int data)
	{
	    std::cout << "A(int)" << " " << this << std::endl;
	}
	~A() 
	{ 
	    std::cout << "~A()" << " " << this  << std::endl; 
	}
};

int main(int argc, char **argv)
{
	A a(1);
	a = 2;
	std::cout << "Breakpoint" << std::endl;
	return 0;
}

Вывод:
A(int) 0x7ffd1f2460a6
A(int) 0x7ffd1f2460a7
~A() 0x7ffd1f2460a7
Breakpoint
~A() 0x7ffd1f2460a6


Кто-нибудь знает почему происходит удаление второго одноименного объекта сразу же после его конструирования, а не первого объекта (ранее созданного) до конструирования второго? Что по этому поводу говорит стандарт?

Понятно, что в приведенном коде нет особого практического смысла, но все же интересно, почему именно так.
  • Вопрос задан
  • 93 просмотра
Решения вопроса 1
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Эквивалентная запись для присваивания:
a = A(2);
Тут создается временный объект, который удаляется после исполнения этой строки.
Оператор присваивания принимает константную ссылку на этот временный объект и потенциально изменяет значения полей объекта this (в вашем случае менять нечего).
Вывод ожидаемый. 2 и 3 строки -- содание и удаление временного объекта.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы