[英]What's wrong with defining a reference to a pointer to a const data with non-const pointer?
[英]what is the best way to return a pointer to vector's data? const or non-const?
#include <vector>
using std::vector;
class A
{
public:
A()
{
buf.push_back(65);
buf.push_back(66);
buf.push_back(67);
}
~A(){}
const char * getA() const
{
// why never run here?
return &buf[0];
}
const char * getA()
{
return &buf[0];
}
char * getB() const
{
// why compile error?
return &buf[0];
}
char * getB()
{
return &buf[0];
}
private:
vector<char> buf;
};
int main()
{
A a;
const char * pc = a.getA();
const char * const cp = a.getA();
char * p = a.getB();
}
两个问题:
1> 为什么会出现编译错误?
2> 为什么
const char * getA() 常量
永远不会被调用?(在我看来,应该首先调用这个,因为我不会更改对象)
我已经调试到矢量class 实现并发现
参考运算符[](size_type _Pos) const {...}
被称为,而不是
const_reference operator[](size_type _Pos) const{...}
一。
PS:我用的是VS2010。
问题 1
存在编译器错误,因为您已将getB()
声明为const
。 因此, buf
实际上是const
,因此operator[]
将返回对成员元素的const
引用。
问题2
getA()
的重载永远不会被调用,因为a
不是const
,所以非const
重载优先。 如果你这样做:
const A *p = &a;
p->getA();
然后将调用const
重载。
对于您的第二个问题:“A a”的原因不是恒定的,永远不会调用 const 版本!
在const
成员 function 中,class 的每个成员都是const
。 也就是说,您不能从 const 向量返回非常量指针,因此此代码中的错误:
char* getB() const
{
// why compile error?
return &buf[0];
}
由于在 function 内部, buf
变为const vector<char>
,因此&bug[0]
变为cont char*
。 所以你需要将返回类型设为const char*
来修复编译错误。
我会回答你的第二个问题。 阅读这个const 正确性。 它说,如果你希望你的 const 重载被称为你的 object 也应该是 const 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.