2011-08-10 32 views
1
#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(); 
} 

两个问题:返回指向矢量数据的指针的最佳方法是什么? const或非const?

1>为什么会有编译错误?

2>为什么

为const char *木屐()const的

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

我已debuged到矢量类的实现,并发现 的

参考操作符[](SIZE_TYPE _Pos)const的 {...}

叫,不

操作者为const_reference [](SIZE_TYPE _Pos)const的{...}

one。

PS:我使用VS2010。

+0

在C++ 0x中,您可以简单地使用向量的'data'成员函数。 –

+0

Alf:反对只是在做'&v [0]'? – rubenvb

回答

5

问题1

有一个编译器错误,因为你已经声明getB()const。因此,buf实际上是const,所以operator[]将返回一个const对成员元素的引用。

问题2

那的getA()过载不会被调用,因为aconst,所以非const超载优先。如果你这样做:

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

然后const重载将被调用。

0

const成员函数中,该类的每个成员都是const。这就是说,在这个代码,你不能从一个const矢量返回非const的指针,因此错误:

​​

由于函数里面,buf变得const vector<char>,并且consquently &bug[0]成为cont char*。所以你需要使返回类型为const char*来修复编译错误。

0

我会回答你的第二个问题。阅读const correctness。 它说,如果你想要你的const超载被调用,你的对象应该也是const。

1

对于第二个问题:“A a”的原因不是恒定的,const版本将永远不会被调用!

相关问题