2012-06-01 190 views
2

可能重複:
Invoking a nonconst method on a member from a const method爲什麼const成員函數能夠通過成員指針調用非const成員函數?

常量成員函數可以調用通過指針成員變量的非恆定成員函數在C++中,它是如預期? 下面給出的代碼片段正在編譯

#include <iostream> 

class S { 
public: 
    void hi() { 
     std::cout << "Hi" << std::endl; 
    } 
}; 

class T { 
public: 
    T() 
    : s(new S()) 
    {} 

    ~T() 
    { 
     delete s; 
    } 

    void hi() const { 
     s->hi(); 
    } 

private: 
    S * s; 
}; 

int main(int argc, char ** argv) { 
    T t; 
    t.hi(); 
    return 0; 
} 

回答

4

該行爲是正確的。

這是因爲指針是const - S * s;,而不是對象。

例如,下面會失敗:

void hi() const { 
    s->hi();  //OK 
    s = NULL; //not OK 
} 

記住,你不能修改s(這是一個指針),但可以修改*s,這是實際的對象。

+0

我們還沒有在類中聲明S * const s,那麼它如何可以是一個常量指針呢? – Kenta

2

const成員函數中的s的類型是S * const而不是S const*,這意味着指針本身是常量,而不是指針指向的對象。因此,非const的對象用於調用非const函數,這是標準符合性行爲。

S const * s1 = initialization1; //same as : const S *s1 = initialization1; 
S * const s2 = initialization2; 

s1->hi();  //error: the object is const 
s1 = nullptr; //okay : the pointer is non-const 

s2->hi();  //okay: the object is non-const 
s2 = nullptr; //error: the pointer is const