返回指向矢量数据的指针的最佳方法是什么? const还是非const?

时间:2011-08-10 14:03:23

标签: c++ visual-studio-2010 stl

#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。

4 个答案:

答案 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。