class Foo
{
};
Foo f;
Foo g = f; // (*)
我的问题是,在标有(*)的行中调用了什么? 它是默认的复制ctr还是'='运算符?
答案 0 :(得分:8)
我的问题是,在标有(*)的行中调用了什么?它是默认的复制ctr还是'='运算符?
将调用复制构造函数。
即使正在使用=
符号,这也是初始化的情况,其中左侧的对象是通过提供右侧的表达式作为参数构造的它的构造函数。
特别是,这种初始化形式称为复制初始化。请注意,当初始化表达式的类型与初始化类对象的类型(在这种情况下为Foo
)相同时,复制初始化基本上等同于直接初始化 ,即:
Foo g(f); // or even Foo g{f} in C++11
唯一的区别是,如果Foo
的复制构造函数被标记为explicit
(很难想象为什么会出现这种情况),在复制的情况下,重载解析将失败 - 初始化。
答案 1 :(得分:2)
g
实际上是作为f
。
记住实际意味着什么的一种简单方法就是回答这个问题:g
已经存在?
{
Foo g; //g construction ends here (at ';')
g = f; // assignment (the g previous value is replaced)
}
{
Foo g = f; //copy (same as Foo g(f): there is no "previous g" here)
}
答案 2 :(得分:1)
Foo g = f; // (*)
复制构造函数被调用。它被称为对象的复制初始化。
如果您没有在类Foo中编写复制构造函数,则会调用编译器生成的复制构造函数。