复制构造函数或 = 运算符

Copy constructor or = operator?

本文关键字:运算符 构造函数 复制      更新时间:2023-10-16
    class Foo
    {

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

我的问题是,标有(*(的行中叫什么?它是默认的复制点击率还是"="运算符?

我的问题是,标有(*(的行中叫什么?它是默认的复制点击率还是"="运算符?

将调用复制构造函数。

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

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

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

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

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)
}
 Foo g = f; // (*)

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

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