S复制构造函数
s copy constructor
复制构造函数的概念真的让我很困惑。我不明白为什么他们使用引用,为什么在复制构造函数常数引用?
使用引用的原因:如果不使用引用,就必须创建要复制的对象的副本。这必须通过复制构造函数来完成。此处插入无限循环
为什么是const引用:你想保证你复制的对象没有被修改。
[Edit]正如DeadMG在他的评论中所说,您还希望引用为const
,以便您可以创建临时实例的副本。例如,假设你有:
class Matrix
{
Matrix const operator+ (Matrix const & rhs) const;
// Code & stuff
}
您希望返回值为const
,以便诸如以下愚蠢的事情引发编译器错误:
Matrix a, b, c;
(a + b) = c;
显然这是一个愚蠢的声明,但是如果operator+
的返回类型不是const
,它实际上是允许的。当然,在下一行,临时(a + b)
将超出作用域,您将永远无法使用它。
但是,如前所述,您希望能够创建具有临时实例的实例:
Matrix a, b;
Matrix c(a + b);
如果复制构造函数的实参不是const
,那么这是不可能的,因为operator+
的返回类型是const
。
c++的"引用"类型可以简单地认为是一个常量指针,初始化为对象的地址值…换句话说,引用永远不能为NULL,它必须指向某个对象。因此,它也可以由编译器在幕后为您隐式解引用,因此您不必担心管理指针本身以及相关的指针语法。
所以对于复制构造函数,你基本上是传递一个常量指针到你要复制的对象到复制构造函数…你不是在复制对象本身。如果您必须将对象本身复制到一个临时对象中,然后由复制构造函数使用该对象创建一个新的副本,如前所述,您最终会遇到一个无限循环,因为首先是什么将对象复制到临时对象中呢?另一方面,如果只是移动指针,则不需要复制构造函数来获取要复制到复制构造函数中的对象。使用引用语法而不是实际的常量指针,因为1)引用不能为NULL(如果是指针语法,我们可以将NULL传递给常量指针),这样做的副产品意味着2)很多事情都更简单,包括语法,因为编译器可以为您执行传入的引用指针的隐式解引用,因此您可以使用正常的成员访问语法,如myclass.member_function()
而不是myclass->member_function()
。
希望有帮助,
杰森- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 使用复制构造函数复制双精度数组
- C 无可行的构造函数复制类型的变量
- 没有可行的构造函数复制类型 'MyString' 的数组元素
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 如何最小化调用列表构造函数(复制构造函数)的次数?
- C 11矢量构造函数复制与范围
- 我定义了一个非复制构造函数;复制构造函数还会被隐式定义吗
- 可以将构造函数复制为转换运算符
- 将基类指针的构造函数复制到子类
- C++树类:构造函数/复制/内存泄漏
- 如何制作这个在模板构造函数复制中使用类型定义的类型的模板
- 将构造函数复制为模板化的成员函数
- 绕过私有复制构造函数/复制赋值C++
- C++通过构造函数复制对象
- 复制构造函数 - 复制C++中的对象
- 将带unique_ptr的类的构造函数复制到作为成员的抽象类