2011-08-10 62 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版本將永遠不會被調用!

相關問題