[英]Conversion constructor clarification
#include<iostream>
using namespace std;
class Test
{
private:
int x;
public:
Test(int i)
{
cout<<"Conversion constructor called..."<<endl;
x = i;
}
~Test()
{
cout<<"Destructor called..."<<endl;
}
void show()
{
cout<<" x = "<<x<<endl;
}
};
int main()
{
Test t(20);
t.show();
t = 30;
t.show();
return 0;
}
输出:
Conversion constructor called...
x = 20
Conversion constructor called...
Destructor called...
x = 30
Destructor called...
当我在做t = 30时,为什么要调用构造函数和析构函数? 请解释。非常感谢。
没有重载=
可用于直接从int
值赋值。 您的转换构造函数允许将30
转换为Test
对象,然后可以使用隐式生成的复制构造函数(复制每个成员)来分配该对象。 所以你的任务相当于
t = Test(30);
创建和销毁要分配的临时对象。
您可以通过提供赋值运算符来避免这种情况:
Test & operator=(int i) {x = i;}
在这种情况下,分配可以直接使用它,等效于
t.operator=(30);
当您写t = 30
,编译器将创建一个临时Test
变量,该变量将使用转换构造函数创建。 在将t
设置t
等于此临时变量之后,该临时变量将被销毁,并调用析构函数。
由于已经定义了t
,因此无法通过转换构造函数对其进行初始化。
而是创建一个temporay Test
对象,调用operator =,然后将其删除。
“为什么要调用构造函数和析构函数?”
因为构造了一个(隐式的) Test
临时实例,将其分配给t
并在分配后销毁。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.