返回对vector成员变量的引用

Return reference to a vector member variable

本文关键字:引用 变量 成员 vector 返回      更新时间:2023-10-16

我有一个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;
}

由于它是const成员函数,返回类型不能是非const引用。改成const:

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

现在好了。

为什么是好的?因为在const成员函数中,every成员变成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

同时声明const和可变变量是很常见的,像这样:

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 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();

如果你想让一个函数返回一个不能被修改的vector对象,可以对vector对象和函数同时使用const修饰符:

const std::vector<int>& getVector() const;

原因是const成员函数应该只返回const引用。这是因为在const函数中,每个数据成员都是常量。

因此你必须这样声明getVector():

std::vector<int> &VectorHolder::getVector() const;