#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&GT;为什么会出现编译错误?
2 - ;为什么
const char * getA()const
永远不会被召唤?(在我看来,首先要调用这个,因为我不会改变对象)
我已经深入研究 vector 类实现并找到了
引用operator [](size_type _Pos)const {...}
被召唤,而不是
const_reference运算符[](size_type _Pos)const {...}
之一。
PS:我使用VS2010。
答案 0 :(得分:5)
问题1
由于您已将getB()
声明为const
,因此存在编译错误。因此,buf
实际上是const
,因此operator[]
将返回对成员元素的const
引用。
问题2
getA()
的重载永远不会被调用,因为a
不是const
,因此非const
重载优先。如果你这样做:
const A *p = &a;
p->getA();
然后调用const
重载。
答案 1 :(得分:1)
对于你的第二个问题:“A a”的原因不是常数,const版本永远不会被调用!
答案 2 :(得分:0)
在const
成员函数中,该类的每个成员都是const
。也就是说,你不能从const向量返回非常量指针,因此这段代码中出现错误:
char* getB() const
{
// why compile error?
return &buf[0];
}
由于在函数内部,buf
变为const vector<char>
,并且&bug[0]
成为cont char*
变为const char*
。因此,您需要将返回类型设置为{{1}}以修复编译错误。
答案 3 :(得分:0)
我会回答你的第二个问题。阅读此const correctness。 它说如果你想要调用你的const重载你的对象也应该是const。