2011-04-27 116 views
4

我,爲什麼這個代碼可以編譯和運行有點糊塗:const成員函數澄清需要

class A 
{ 
private: 
    int* b; 
public: 
    A() : b((int*)0xffffffff) {} 
    int* get_b() const {return this->b;} 
}; 

int main() 
{ 
    A a; 
    int *b = a.get_b(); 
    cout<<std::hex<<b<<endl; 
    return 0; 
} 

運行此代碼的輸出是FFFFFFFF以及...意想不到的我。由於它在一個const成員函數中,因此this->b不應該返回const int*?因此return線應該產生一個編譯器鑄造錯誤嘗試投放const int*int*

顯然,在我什麼const成員函數意味着知識這裏有一個差距。 如果有人能幫我彌補這個空白,我會很感激。

回答

4

不,成員是int* const(從const函數中可以看出),這是完全不同的。

指針是const,而不是指向的對象。

+0

對。這解釋了它。所以如果b是int並且get_b會嘗試返回this-> b,那麼我會得到cast轉換錯誤。對? – eladidan 2011-04-27 15:11:59

+0

如果b是一個int並且你試圖返回&b,編譯器會抱怨,是的。 – 2011-04-27 15:14:50

+0

對不起,對,&(this-> b),謝謝 – eladidan 2011-04-27 15:17:43

2

const成員函數的一部分只是說,當this指針(也就是它被調用的對象)是const時,允許調用該函數。它與返回值無關。

class A{ 
public: 
    void non_const_func(){} 
    void const_func() const {} 
}; 

int main(){ 
    A a; 
    a.const_func(); // works 
    a.non_const_func(); // works too 

    const A c_a; 
    c_a.const_func(); // works again 
    c_a.non_const_func(); // EEEK! Error, object is const but function isn't! 

}

2

功能按值返回一個整數的指針 - 你不能改變類的成員是通過這個值的副本,所以沒有違反常量。

0

在函數聲明之後加上const就像你告訴編譯器「嘿,我保證不修改*this!」。你的方法只是一個訪問器。

請參閱C++ FAQ LITE 18.10