返回对vector成员变量的引用

时间:2011-12-05 10:56:49

标签: c++ vector reference const

我有一个向量作为类的成员,我想通过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;
}

4 个答案:

答案 0 :(得分:32)

由于它是const成员函数,因此返回类型不能是非const引用。设为const

const std::vector<int> &VectorHolder::getVector() const
{
   return myVector;
}

现在没关系。

为什么这样好?因为在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 ,如果它返回引用

现在您无法修改相同的对象。看看你能做什么,不能做什么:

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;