显式和非显式构造函数
Explicit and non-explicit constructors
class Test
{
public:
Test(int i) { cout<<"constructor called\n";}
Test(const Test& t) { cout<<" copy constructor called\n";}
};
class Test1
{
public:
Test1(int i) { cout<<"constructor called\n";}
explicit Test1(const Test1& t) { cout<<" copy constructor called\n";}
};
int main()
{
Test t(0);
Test u = 0;
//Test1 t1(0); Line 1
//Test1 u1 = 0; Line 2
}
我观察到不同的输出。
情况 1:当第 1 行和第 2 行被注释时,o/p 是:
调用的构造函数
调用的构造函数
情况2:当第1行和第2行取消注释时:然后编译错误
有人可以解释输出结果及其原因吗?也有人可以告诉 operator= 是否真的最终调用了复制构造函数。
测试u = 0是转换构造函数的情况。详情请参考What is a converting constructor in C++ ? What is it for?。
删除注释后,我尝试编译注释行,它为我编译了。我正在使用 gcc 版本 4.3.4。您使用的是哪个版本的编译器?
你的问题在于下面那个显式构造函数,加上对对象初始化的一点误解。
根据this,表达式:
Type variableName = value;
会总是执行复制这样一个对象的初始化,也就是说:
Test1 u1 = 0;
将使用参数 Test1(int)
有效地调用重载构造函数 Test1::Test1(const Test1&)
,从而导致 u1::Test1(Test1(0))
.
而且,最重要的是,因为您将 复制构造函数 声明为 explicit,复制样式初始化将失败,但是:
Test1 t1(0);
会编译,因为这个表达式调用了方向初始化,即使Test1(int)会被标记为explicit,直接初始化是明确的,所以每件都匹配。
class Test
{
public:
Test(int i) { cout<<"constructor called\n";}
Test(const Test& t) { cout<<" copy constructor called\n";}
};
class Test1
{
public:
Test1(int i) { cout<<"constructor called\n";}
explicit Test1(const Test1& t) { cout<<" copy constructor called\n";}
};
int main()
{
Test t(0);
Test u = 0;
//Test1 t1(0); Line 1
//Test1 u1 = 0; Line 2
}
我观察到不同的输出。 情况 1:当第 1 行和第 2 行被注释时,o/p 是: 调用的构造函数 调用的构造函数
情况2:当第1行和第2行取消注释时:然后编译错误
有人可以解释输出结果及其原因吗?也有人可以告诉 operator= 是否真的最终调用了复制构造函数。
测试u = 0是转换构造函数的情况。详情请参考What is a converting constructor in C++ ? What is it for?。
删除注释后,我尝试编译注释行,它为我编译了。我正在使用 gcc 版本 4.3.4。您使用的是哪个版本的编译器?
你的问题在于下面那个显式构造函数,加上对对象初始化的一点误解。
根据this,表达式:
Type variableName = value;
会总是执行复制这样一个对象的初始化,也就是说:
Test1 u1 = 0;
将使用参数 Test1(int)
有效地调用重载构造函数 Test1::Test1(const Test1&)
,从而导致 u1::Test1(Test1(0))
.
而且,最重要的是,因为您将 复制构造函数 声明为 explicit,复制样式初始化将失败,但是:
Test1 t1(0);
会编译,因为这个表达式调用了方向初始化,即使Test1(int)会被标记为explicit,直接初始化是明确的,所以每件都匹配。