Фраза, которую вы, вероятно, ищете, это "неявное преобразование".
Если вы добавите конструктор копирования и оператор присваивания, а затем дадите каждому объекту уникальный идентификатор, вам будет легче увидеть, куда идут вещи:
int counter = 0;
class A {
public:
int id;
A(): id(++counter) {cout << "A(): " << id << "\n";}
A(int i) : id(++counter) {cout << "A(" << i << "): " << id << "\n";}
// Don't copy the id.
// (This isn't used anywhere, but you can't see that it's not used unless it exists.)
A(const A& a) : id(++counter) {cout << "A(" << a.id << "): " << id << "\n";}
// Don't copy the id here either.
A& operator=(const A&a) {cout << id << " = " << a.id << "\n"; return *this;}
~A(){cout << "destroy: " << id << "\n";}
};
int main(){
A p;
cout << "p is " << p.id << "\n";
p = 3;
cout << "p is " << p.id << "\n";
p = 5;
cout << p.id << "\n";
}
Вывод:
A(): 1
p is 1
A(3): 2
1 = 2
destroy: 2
p is 1
A(5): 3
1 = 3
destroy: 3
1
destroy: 1
Как видите, параметризованный конструктор используется для создания временного объекта, значение которого может быть присвоено p
, и этот временный объект уничтожается сразу после этого.
Вы также можете видеть, что p
живы и здоровы до самого конца.