[英]Return reference to a vector member variable
我有一个向量作为类的成员,我想通过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;
}
由于它是const
成员函数,因此返回类型不能是非const引用。 使它成为const
:
const std::vector<int> &VectorHolder::getVector() const
{
return myVector;
}
现在没关系。
为什么这样好? 因为在const
成员函数中,每个成员都以不能修改的方式变为const ,这意味着myVector
是const
中的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
。
声明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
所以这一切都很好(除了方法的冗余)。
函数getVector
可以声明为const
。 它返回一个可以修改的引用,因此当实际函数不修改类中的任何内容时,调用者将能够修改内部数据。
声明为:
std::vector<int>& getVector();
如果希望函数返回无法修改的向量,则在向量和函数上使用const
修饰符:
const std::vector<int>& getVector() const;
原因是const成员函数应该只返回const引用。 这是因为在const函数中,每个数据成员都变为常量。
因此,您必须以这种方式声明getVector():
std::vector<int> &VectorHolder::getVector() const;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.