1. 程式人生 > >解密之------const型別物件只能訪問const型別成員函式

解密之------const型別物件只能訪問const型別成員函式

在學習const修飾的物件時,我們總會聽到const和非cosnt間的訪問原則如下:

const型別物件可以訪問非const型別成員函式,但是不能訪問const型別成員函式。

在一個物件呼叫建構函式時,會隱含一個新參this指標

也就是說,當我們定義了一個類(A)的非const型別的成員函式為A::Fun()。
實際上在編譯器中該函式的定義是A::Fun(A* const this)該this指向的內容可以改變,但是this指標不能被改變。當我們用A的一個物件a呼叫Fun函式,a.Fun(),編譯器會將其解釋為Fun(&a),所以在Fun中使用this指標就可以改變物件a的成員變量了。

當物件是const型別的,即const A a;那麼是什麼意思呢?

表示的是a的內容不可以改變,當我們把&a作為引數傳到形參this時,就出現了矛盾。a是一個變數,其成員不可以改變。this指標的成員變數是可以改變的。如果我們將a的地址傳給this,那麼a這個變數的值也就可以在this中改變了,所以,編譯器是不允許出現這種矛盾的,就會給我們提示錯誤訊息。

所以,const型別物件是不可以訪問非const型別成員函式。

那麼,當成員函式是const型別時,A::Fun() const,在編譯器解釋時會將函式解釋為 A::Test(const A* const this); this指標及其所指向的內容都不可被修改,也就不會存在前面說的矛盾了。

所以,const物件可以訪問const型別的成員函式。

同理,
const成員函式內可以呼叫其它的const成員函式,但是const成員函式不可以呼叫非const成員函式。
非const成員函式內既可以呼叫其它的const成員函式,也可以呼叫非const成員函式。