返回对vector成员变量的引用

arj*_*soh 29 c++ const reference vector

我有一个向量作为类的成员,我想通过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;
}
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 34

由于它是一个const成员函数,因此返回类型不能是非const引用.成功const:

const std::vector<int> &VectorHolder::getVector() const
{
   return myVector;
}
Run Code Online (Sandbox Code Playgroud)

现在没关系.

为什么这样好?因为在一个const成员函数中,每个成员都以这样一种方式变成const,它无法被修改,这意味着它myVectorconst函数中的一个向量,这就是为什么你必须返回类型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
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我想知道为什么你首先需要这样VectorHolder的.


jus*_*tin 15

声明const和mutable变体并不罕见,如下所示:

std::vector<int>& VectorHolder::getVector() {
  return myVector;
}
const std::vector<int>& VectorHolder::getVector() const {
  return myVector;
}
Run Code Online (Sandbox Code Playgroud)

程序的根本问题是从const方法返回非const引用.

std::vector<int>& VectorHolder::getVector() const {
  return myVector; // << error: return mutable reference from const method
}
Run Code Online (Sandbox Code Playgroud)

所以你使用这个表单使它成为const:

const std::vector<int>& VectorHolder::getVector() const {
  return myVector; // << ok
}
Run Code Online (Sandbox Code Playgroud)

当这是非const方法或客户端持有非const引用时,您可以合法地使用非const方法:

std::vector<int>& VectorHolder::getVector() {
  return myVector; // << ok
}
Run Code Online (Sandbox Code Playgroud)

最后,你可以返回一个值(在某些情况下):

std::vector<int> VectorHolder::getVector() const {
  return myVector; // << ok
}
Run Code Online (Sandbox Code Playgroud)

因为副本不需要突变,也不会暴露内部数据.

因此,您最终会经常声明这两种变体.

声明两者的结果是:

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
Run Code Online (Sandbox Code Playgroud)

所以这一切都很好(除了方法的冗余).