7
    class Foo
    {


    };

    Foo f;
    Foo g = f; // (*)

我的问题是,在标有 (*) 的行中调用了什么?它是默认的复制 ctr 还是 '=' 运算符?

4

3 回答 3

9

我的问题是,在标有 (*) 的行中调用了什么?它是默认的复制 ctr 还是 '=' 运算符?

将调用复制构造函数。

即使=使用了符号,这是一个初始化的情况,左侧的对象是通过将右侧的表达式作为参数提供给其构造函数来构造的。

特别是,这种形式的初始化称为复制初始化。注意,当初始化表达式的类型与初始化的类对象的类型相同时(Foo本例中为 ),复制初始化基本等同于直接初始化,即:

Foo g(f); // or even Foo g{f} in C++11

唯一细微的区别是,如果复制构造函数Foo被标记为explicit(很难想象为什么会这样),在复制初始化的情况下重载决议将失败。

于 2013-06-16T12:56:03.047 回答
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)
}
于 2013-06-16T14:03:32.323 回答
1
 Foo g = f; // (*)

复制构造函数被调用。它称为对象的复制初始化。

如果您没有在类 Foo 中编写复制构造函数,则编译器生成的复制构造函数将被调用。

于 2013-06-16T13:01:01.123 回答