我有一个向量作为类的成员,我想通过getVector()函数返回对它的引用,以便以后能够修改它。是不是更好地练习函数getVector()为const?但是我在下面的代码中收到错误“在类型的绑定引用中删除了限定符...”。应该修改什么?
class VectorHolder
{
public:
VectorHolder(const std::vector<int>&);
std::vector<int>& getVector() const;
private:
std::vector<int> myVector;
};
std::vector<int> &VectorHolder::getVector() const
{
return myVector;
}
答案 0 :(得分:32)
由于它是const
成员函数,因此返回类型不能是非const引用。设为const
:
const std::vector<int> &VectorHolder::getVector() const
{
return myVector;
}
现在没关系。
为什么这样好?因为在const
成员函数中,每个成员都变为 const ,其方式无法修改,这意味着myVector
是const
向量中的const
向量函数,这就是为什么你必须返回类型 std::vector<int> & a = x.getVector(); //error - at compile time!
const std::vector<int> & a = x.getVector(); //ok
a.push_back(10); //error - at compile time!
std::vector<int> a = x.getVector(); //ok
a.push_back(10); //ok
,如果它返回引用。
现在您无法修改相同的对象。看看你能做什么,不能做什么:
VectorHolder
顺便说一句,我想知道为什么你首先需要这样的{{1}}。
答案 1 :(得分:14)
声明const和mutable变体并不罕见,如下所示:
std::vector<int>& VectorHolder::getVector() {
return myVector;
}
const std::vector<int>& VectorHolder::getVector() const {
return myVector;
}
你的程序的根本问题是你从const方法返回一个非const引用。
std::vector<int>& VectorHolder::getVector() const {
return myVector; // << error: return mutable reference from const method
}
所以你使用这个形式使它成为const:
const std::vector<int>& VectorHolder::getVector() const {
return myVector; // << ok
}
当这是非const方法或客户端持有非const引用时,您可以合法地使用非const方法:
std::vector<int>& VectorHolder::getVector() {
return myVector; // << ok
}
最后,你可以返回一个值(在某些情况下):
std::vector<int> VectorHolder::getVector() const {
return myVector; // << ok
}
因为副本不需要突变,也不会暴露内部数据。
因此,您最终会经常声明这两种变体。
声明两者的结果是:
VectorHolder m;
const VectorHolder c;
m.getVector().size(); // << ok
c.getVector().size(); // << ok - no mutation
m.getVector().push_back(a); // << ok
c.getVector().push_back(a); // << error: attempt to mutate const reference because the const vector is returned
所以这一切都很好(除了方法的冗余)。
答案 2 :(得分:2)
函数getVector
可以声明为const
。它返回一个可以修改的引用,因此当实际函数不修改类中的任何内容时,调用者将能够修改内部数据。
声明为:
std::vector<int>& getVector();
如果希望函数返回无法修改的向量,请在向量和函数上使用const
修饰符:
const std::vector<int>& getVector() const;
答案 3 :(得分:0)
原因是const成员函数应该只返回const引用。这是因为在const函数中,每个数据成员都变为常量。
因此你必须以这种方式声明getVector():
std::vector<int> &VectorHolder::getVector() const;