繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM