繁体   English   中英

返回对vector成员变量的引用

[英]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 ,这意味着myVectorconst中的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM