复制构造函数或 = 运算符
Copy constructor or = operator?
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 中编写复制构造函数,则调用编译器生成的复制构造函数。
相关文章:
- 构造函数和转换运算符之间的重载解析
- 复制构造函数、赋值运算符C++
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 为用户定义的类正确调用复制构造函数/赋值运算符
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- 让某个类的 '=' 运算符在声明时运行构造函数
- C++:使用运算符 = 调用多参数构造函数
- 应用于运算符而不是构造函数的显式关键字
- 运算符+ 的规范实现涉及额外的移动构造函数
- 运算符 new 的执行顺序和构造函数的参数
- 非模板 std::reference_wrapper赋值运算符和模板构造函数
- 如果我也使用复制构造函数并且重载 = 运算符,我是否需要析构函数?
- 复制构造函数和赋值运算符的值类实现
- 在构造函数中使用重载运算符?
- 在C++中,我可以在定义自己的复制构造函数后跳过定义赋值运算符吗?
- 返回语句中的C++11显式转换运算符/构造函数
- 如何正确地从运算符构造函数内部调用复制构造函数
- 是否可以创建指向函数的"new"运算符/构造函数的函数指针?
- C++,使用运算符<<构造函数的输入