Учитывая этот класс:
class Baz
{
public:
Baz() : Baz(0) {}
Baz(int i) { _i = i; }
Baz(Baz const &b) { _i = b._i * 10; }
~Baz() { }
private:
int _i;
};
Если я отлаживаю и прохожу через этот код:
Baz a = 4;
Конструктор Baz
, который принимает int
, вызывается, как и ожидалось , и я получаю Baz
с _i
из 4. Это хорошо.
Но если я сделаю это:
Baz b;
b = 4;
Первая строка вызывает конструктор по умолчанию, как и ожидалось. Вторая строка вызывает int
конструктор , а затем деструктор .
Мое первое ожидание заключалось в том, что вторая строка второго примера просто вызовет конструктор int
при назначении b
. Я не ожидал, что деструктор будет вызван, но если он сначала преобразует целое число 4
в Baz
перед присваиванием, имеет смысл уничтожить его после. Но тогда я ожидал бы, что конструктор копирования будет вызван при присвоении временного значения b
. Уничтоженный Baz
имеет значение 4
вместо _i
, так что это не объект, созданный в первой строке.
Что именно здесь происходит? Почему разница между этими двумя сценариями ios?