const對象只能訪問const成員函數(shù)
在一個(gè)對象調(diào)用其成員函數(shù)時(shí),它隱含的一個(gè)形參this指針。
例如,我們定義了一個(gè)函數(shù)CTest::ttt();實(shí)際上在編譯器中該函數(shù)的定義就是CTest::ttt(CTest *const this),該this指針?biāo)赶虻膬?nèi)容可以改變,但是該this指針不可以被改變。當(dāng)我們用CTest的一個(gè)對象test1調(diào)用ttt函數(shù)時(shí)即test1.ttt()時(shí),編譯器就會將它解釋為ttt(&test1),所以我們在ttt中使用this指針就可以改變對象test1的成員變量了。
但是,當(dāng)我們的對象是const對象時(shí),即const CTest ttt;這時(shí)候表示什么意思呢,ttt的內(nèi)容是不可以改邊的,當(dāng)我們把&ttt作為一個(gè)參數(shù)傳到形參this時(shí),矛盾出現(xiàn)了:ttt是一個(gè)常量,其成員不可以被改變;this指針的成員變量是可以改變的。如果我能正確的將ttt 的地址傳給this,那么ttt這個(gè)常量的值不是可以在this中被改變了嗎,所以,編譯器是不允許這種情況出現(xiàn)的,就提示錯(cuò)誤了。故,const對象不能訪問非const成員函數(shù)。
同理,當(dāng)我們的成員函數(shù)是const成員函數(shù)時(shí),例:CTest::ttt() const,在編譯器解釋時(shí)會將該函數(shù)解釋為CTest::ttt(const CTest * const this),this指針及其所指向的內(nèi)容都不可以被修改,前面提到的矛盾也就不存在了,所以const對象可以訪問const成員變量。