const和非复制构造函数中的const?

时间:2014-09-14 06:36:24

标签: c++ constructor copy-constructor

当我编写我的复制构造函数时:(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);

我收到错误:“没有可用的复制构造函数或复制构造函数被声明为'explicit'”。 但是当我写道:

HocSinh::HocSinh(const HocSinh &a)
{
    hoTen = a.hoTen;
    diemVan = a.diemVan;
    diemToan = a.diemToan;
}

没有错误。 有人可以帮我解释一下。感谢大家,对不起,如果我的英语太糟糕了。

1 个答案:

答案 0 :(得分:4)

因为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