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,它无法被修改,这意味着它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
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)
所以这一切都很好(除了方法的冗余).