复制构造函数中的 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& val
作为这个副本的来源,所以它需要一个带有const
签名的复制构造函数来获取val
。
【讨论】:
这并没有解释为什么需要一个带有 const 左值引用参数的复制构造函数。 @juanchopanza OP问为什么应该有const
,很明显如果你想在void push_back (const value_type& val);
的实现中使用val
作为函数参数,函数必须假设一个const
参数。
这不是很明显。简短的解释可以使答案更好。以上是关于复制构造函数中的 const 而不是 const?的主要内容,如果未能解决你的问题,请参考以下文章