Ach*_*ich 2 c++ constructor explicit copy-constructor copy-initialization
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
}
Run Code Online (Sandbox Code Playgroud)
我观察到不同的输出。情况 1:当第 1 行和第 2 行被注释时,o/p 为:构造函数调用 构造函数调用
情况 2:当第 1 行和第 2 行取消注释时:则编译错误
有人可以解释一下输出及其原因吗?也有人可以告诉operator=是否实际上最终调用了复制构造函数。
您的问题在于那里的显式构造函数,以及对对象初始化的轻微误解。
据此,表达式为:
Type variableName = value;
Run Code Online (Sandbox Code Playgroud)
将始终执行此类对象的复制初始化,这意味着:
Test1 u1 = 0;
Run Code Online (Sandbox Code Playgroud)
将有效地调用Test1::Test1(const Test1&)带有参数的重载构造函数Test1(int),从而产生u1::Test1(Test1(0)).
而且,最重要的是,因为您将复制构造函数声明为显式,所以复制样式初始化将失败,但是:
Test1 t1(0);
Run Code Online (Sandbox Code Playgroud)
将编译,因为此表达式调用方向初始化,即使Test1(int)将被标记为显式,直接初始化也是显式的,因此每个部分都匹配。
| 归档时间: |
|
| 查看次数: |
3065 次 |
| 最近记录: |