C++ 转换构造函数说明

C++ 转换构造函数说明,c++,constructor,assignment-operator,C++,Constructor,Assignment Operator,当我做t=30时,为什么它调用构造函数和析构函数? 请解释。非常感谢。当您编写t=30时,编译器会创建一个临时Test变量,它使用转换构造函数创建该变量。将t设置为等于此临时变量后,临时变量将被销毁,并调用析构函数。由于t已定义,因此无法通过转换构造函数初始化 相反,它创建一个temporayTest对象,调用操作符=,然后删除它 “它为什么调用构造函数和析构函数?” 因为有一个Test的(隐式)临时实例被构造,分配给t,并在分配后被销毁。没有可用于直接从int值分配的=重载。您的转换构造函数允

当我做t=30时,为什么它调用构造函数和析构函数?
请解释。非常感谢。

当您编写
t=30
时,编译器会创建一个临时
Test
变量,它使用转换构造函数创建该变量。将
t
设置为等于此临时变量后,临时变量将被销毁,并调用析构函数。

由于
t
已定义,因此无法通过转换构造函数初始化

相反,它创建一个temporay
Test
对象,调用操作符=,然后删除它

“它为什么调用构造函数和析构函数?”


因为有一个
Test
的(隐式)临时实例被构造,分配给
t
,并在分配后被销毁。

没有可用于直接从
int
值分配的
=
重载。您的转换构造函数允许将
30
转换为
Test
对象,然后可以使用隐式生成的复制构造函数(复制每个成员)分配该对象。所以你的作业相当于

Conversion constructor called...
 x = 20
Conversion constructor called...
Destructor called...
 x = 30
Destructor called...
Test & operator=(int i) {x = i;}
创建和销毁要从中分配的临时对象

您可以通过提供赋值运算符来避免这种情况:

t = Test(30);
在这种情况下,任务可以直接使用此功能,相当于

Conversion constructor called...
 x = 20
Conversion constructor called...
Destructor called...
 x = 30
Destructor called...
Test & operator=(int i) {x = i;}

@paddy:默认赋值运算符用于从另一个
测试
复制赋值,而不是从任意类型复制赋值。