返回对vector成员变量的引用
Return reference to a vector member variable
我有一个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;
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 多个"常量引用"变量可以共享同一个内存吗?
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- C++方法中的引用变量
- 作为赋值(增加引用变量)C++的左操作数所需的左值
- 使用更改此变量的函数在同一行中打印引用变量
- 将延迟变量分配给引用变量
- 如何通过引用获取引用变量的地址?
- 将引用变量传递给函数
- C++中引用变量的内存?
- 按名称存储和引用变量列表
- 返回一个C++引用变量 VS 返回一个变量
- c++ 在 if 语句中分配引用变量
- 引用变量何时合适,为什么?你能解释一下实际的语法和位置吗?
- C++ - 将一个变量分配给另一个变量和将变量分配给引用变量有什么区别?
- 在类范围内声明时,应在 C++14 中引用变量模板
- 当引用变量的引用"死亡"时,它会发生什么?
- 将非按引用变量分配给返回按引用的函数,反之亦然
- 引用变量如何存储在mem中
- 引用变量存储在哪里