C 成員函式形參列表後的const

2021-08-20 08:37:08 字數 2518 閱讀 1749

有時候我們在閱讀一些原始碼時,發現有些類的成員函式的形參列表後面有個const,但是使用的時候感覺跟那些沒有const的成員函式沒有啥區別,舉個簡單栗子如下,

#include

using

namespace std;

class

testclass

virtual

~testclass()

intgetval_v1()

intgetval_v2()

const

private

:int val;};

intmain()

編譯執行都ok,輸出如下,

有點懵,那這個const有什麼作用呢?

要回答這個問題,需要先回顧一下類的this指標。

繼續分析上一節的程式,當我們例項化類testclass生成了物件tc,然後呼叫成員函式getval_v1(),就可以拿到tc的private變數val,看上去一氣呵成,但是這裡需要思考乙個問題:getval_v1()是怎麼拿到val的呢?

這就是靠this指標來完成的,成員函式通過this這個額外的隱式引數來訪問呼叫它的物件。當我們呼叫成員函式時,會用物件的位址來初始化this指標(物件就是呼叫成員函式的物件)。這樣我們在成員函式裡就可以拿到物件的私有變數了。

getval_v1()函式也可以寫成如下形式,(一般為了方便會省去this)

int

getval_v1()

this形參是隱式定義的,不會顯式地出現在成員函式形參列表裡,但實際是存在的,所以任何自定義為this的引數或變數都是非法的。

因為this指標總是指向這個物件,所以this是乙個常量指標,不允許修改this的值。this指標的預設初始化過程等價如下,

testclass *const this = &tc;

ps:常量指標和指標常量是不同意思,常量指標是說指標的值是const的,指標常量是說指標指向的變數的值是const的,還有常指標常量,看字面就知道是把常量指標和指標常量合在一起,不但指標本身是const的,而且指標指向的變數也是const的。omg!!!

成員函式形參列表後帶const,這樣的成員函式叫做類的const成員函式,也叫常量成員函式。這個const作用是用來修改隱式this指標的型別,把它變成常指標常量(請閱讀上一節的ps部分,如果還看不懂,就請查閱《c++ primer 5th》2.4.2節)。

為何要轉變?這裡以上一節的**為例,預設情況下,this指標是常量指標,但是如果tc是個常量物件,那麼this的預設初始化就是非法的,c++規定只能使用指向常量的指標來存放常量物件的位址。這裡修改下第二節的**,如下,

#include

using

namespace std;

class

testclass

virtual

~testclass()

intgetval_v1()

intgetval_v2()

const

private

:int val;};

intmain()

這裡把tc宣告為常量物件,此時再編譯就出錯了。

這裡有2個解決辦法:

在成員函式getval_v1()的形參列表後加上const,編譯就ok了,也可以正常執行;

不加const,然後在main函式裡注釋掉getval_v1()的相關語句,程式也可以正常編譯執行,如下,(可以看出常量物件只能呼叫常量成員函式)

int

main()

講到這裡,就弄明白這個const的作用了,就是把this指標由預設的常量指標變成常指標常量。有了const後,this指標的初始化過程就等價如下,

const testclass *const this = &tc;

因為此時this是指向常量的,所以常量成員函式不能改變呼叫它的物件的內容,也就是不能修改物件的私有變數值。

另外,非常量物件可以呼叫常量成員函式,但也是無法修改物件的內容的。

經過上述三節,就搞明白成員函式形參列表後const的作用了,簡單概述下,就是把this指標由預設的常量指標變成常指標常量,然後常量物件就可以呼叫這些常量成員函式了。

這裡再貼乙個《c++ primer 5th》中關於常量成員函式的note:

常量物件,以及常量物件的引用或指標都只能呼叫常量成員函式。

C 函式的形參

這些天又在複習c 溫故知新,每次看書都會發現一些之前被自己忽視掉的知識點,所以,學習是不能止步的!作為一種程式語言,c 最重要的兩個部分就是函式和變數,這兩者之間進行溝通便是通過引數傳遞,而引數傳遞有很多需要注意的細節,今天就來講講引數傳遞的問題。總的來說,引數傳遞的過程,就是初始化函式形參的過程。...

C 帶預設形參的函式

先上 int sub int x 8,int y 3 void main 注意事項 1 c 呼叫函式時,引數是自由到左入棧的。因此,預設形參必須從右向左連續定義,並且在乙個預設形參的右邊不能有非預設的形參。int f int a,float b 5.0,char c int d 10 正確 int ...

關於C 類的成員函式是否要加關鍵字「const」

原則 類的成員函式在小括號後大括號前加上 const 代表不準備改變物件的資料。不加的話代表有可能會改變物件的資料。1.當常量物件,就是加上const修飾的類的成員去呼叫常量成員函式時,這表示 物件的初始化資料一定不能改變,常量成員函式說 放心,我不會改變你的初始化資料的,這一切都很好。2.當常量物...