复制构造函数中的 const 而不是 const?

Posted

技术标签:

【中文标题】复制构造函数中的 const 而不是 const?【英文标题】:const and not const in copy constructor? 【发布时间】:2014-09-14 06:36:24 【问题描述】:

当我编写复制构造函数时:(HocSinh 是一个类)

HocSinh::HocSinh(HocSinh &a)

    hoTen = a.hoTen;
    diemVan = a.diemVan;
    diemToan = a.diemToan;

然后:

HocSinh hocSinh("abc", 1, 2);
vector <HocSinh> dsHSCanTim;
dsHSCanTim.push_back(hocSinh);

我收到一个错误:“没有可用的复制构造函数或复制构造函数被声明为‘显式’”。 但是当我写的时候:

HocSinh::HocSinh(const HocSinh &a)

    hoTen = a.hoTen;
    diemVan = a.diemVan;
    diemToan = a.diemToan;

没有错误。 有人可以为我解释一下吗。谢谢大家,如果我的英语这么差,请见谅。

【问题讨论】:

如果 HocSinh 是你班级的名字,你怎么会在 dsHSCanTim.push_back(HocSinh);push_back 需要 HocSinh 的对象 一般来说,复制 ctor 应该通过 const 引用来获取它的参数,除非有令人信服的理由让它成为非常量。 对不起,它是:HocSinh hocSinh("abc", 1, 2); 和 push_back(hocSinh)。 一般来说,只要有可能,您应该使用const。您的复制构造函数不会修改其参数,因此它可以const,因此它应该const。这确保了它可以接受 const 和 non-const 对象。 【参考方案1】:

因为std::vector::push_back被定义为

void push_back (const value_type& val);
void push_back (value_type&& val);

对于像hocSinh 这样的左值,std::vector::push_back 模板将使用第一个。在std::vector::push_back 实现内部,使用复制构造函数在std::vector 分配的内存段中构造对象。实现必须使用const value_type&amp; val作为这个副本的来源,所以它需要一个带有const签名的复制构造函数来获取val

【讨论】:

这并没有解释为什么需要一个带有 const 左值引用参数的复制构造函数。 @juanchopanza OP问为什么应该有const,很明显如果你想在void push_back (const value_type&amp; val);的实现中使用val作为函数参数,函数必须假设一个const 参数。 这不是很明显。简短的解释可以使答案更好。

以上是关于复制构造函数中的 const 而不是 const?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 复制构造函数必须使用 const 对象?

移动选定的构造函数而不是复制。 [参考标准]

复制“const”构造函数 - 链接器错误?

为啥在通过 const 引用传递临时值时调用复制构造函数?

为啥我们使用 const 和 reference 作为参数来复制构造函数?

为什么复制构造函数的参数需要加const和引用