c++ - 返回指向 vector 数据的指针的最佳方法是什么? const 还是非常量?

标签 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>为什么会出现编译错误?

2>为什么

const char * getA() const

永远不会被调用?(在我看来,应该先调用这个,因为我不会改变对象)

我调试了 vector 类实现并发现

reference operator[](size_type _Pos) const {...}

被称为 ,而不是

const_reference operator[](size_type _Pos) const{...}

一个。

PS:我用的是VS2010

最佳答案

问题一

存在编译器错误,因为您已将 getB() 声明为 const。因此,buf 实际上是 const,因此 operator[] 将返回对成员元素的 const 引用。

问题二

getA() 的重载永远不会被调用,因为 a 不是 const,所以非 const 过载优先。如果你这样做:

const A *p = &a;
p->getA();

然后将调用 const 重载。

关于c++ - 返回指向 vector 数据的指针的最佳方法是什么? const 还是非常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7012073/

相关文章:

c++ - 如何比较c++列表中的两个连续元素

c++ - 在 C++ 中的多态方法上使用 std::for_each

c++ - 为什么不能在 C++ 中重载 '.' 运算符?

c++ - 打印任何 STL 容器

c++ - 对父类中方法的 undefined reference

c++ - C++中的特征库是否有动态 vector 或矩阵

c# - 我如何告诉 VS2010 在我的 list 中包含文件以进行发布?

c# - 使用多个版本的 Visual Studio

vb.net - 如何按日期/时间过滤文件名?

c++ - 如何确保 std::map 已订购?