c primer 第七章 類

2021-08-14 16:24:10 字數 1410 閱讀 5925

const更大的作用是可以修飾函式的引數,返回值,定義體。

1.用const 修飾函式的引數

如果引數作輸出用,不論它是什麼資料型別,也不論它採用「指標傳遞」還是「引用傳遞」,都不能加const修飾,否則該引數將失去輸出功能。const 只能修飾輸入引數:

如果輸入引數採用「指標傳遞」,那麼加const修飾可以防止意外地改動該指標,起到保護作用。

例如stringcopy 函式:

void stringcopy(char*strdestination, const char *strsource); //如果是傳值引數,只能用於輸入引數

如果是引用或指標型別,則即可用於輸入也可用於輸出

其中strsource是輸入引數,strdestination 是輸出引數。給strsource加上const修飾後,如果函式體內的語句試圖改動strsource 的內容,編譯器將指出錯誤。

如果輸入引數採用「值傳遞」,由於函式將自動產生臨時變數用於複製該引數,該輸入引數本來就無需保護,所以不要加const修飾。

例如不要將函式void func1(int x) 寫成voidfunc1(const int x)。同理不要將函式void func2(a a) 寫成void func2(const aa)。其中a 為使用者自定義的資料型別。

為了提高效率,可以將函式宣告改為void func(a&a),因為「引用傳遞」僅借用一下引數的別名而已,不需要產生臨時物件。但是函式void func(a&a) 存在乙個缺點:

「引用傳遞」有可能改變引數a,這是我們不期望的。解決這個問題很容易,加const修飾即可,因此函式最終成為voidfunc(const a &a)。

以此類推,是否應將void func(int x)改寫為void func(const int&x),以便提高效率?完全沒有必要,因為內部資料型別的引數不存在構造、析構的過程,而複製也非常快,「值傳遞」和「引用傳遞」的效率幾乎相當。

2.const修飾函式返回值,表示返回值是常量;而const放在後面,表示修飾函式體,告訴編譯器該函式體內的操作不能改變其類的成員變數,以避免不必要的錯誤,還有就是如下:

如果給以「指標傳遞」方式的函式返回值加const 修飾,那麼函式返回值(即指標)的內容不能被修改,該返回值只能被賦給加const 修飾的同型別指標。例如函式

const char * getstring(void);

如下語句將出現編譯錯誤:

char *str = getstring();

正確的用法是

const char *str = getstring();

3.const成員函式(const的作用:說明其不會修改資料成員)任何不會修改資料成員的函式都應該宣告為const 型別。如果在編寫const成員函式時,不慎修改了資料成員,或者呼叫了其它非const成員函式,編譯器將指出錯誤,這無疑會提高程式的健壯性。

C Primer 第七章 類

成員函式 宣告在類內,定義可內可外,定義在類內則是隱式內聯函式 在成員函式內部,可以直接使用呼叫該函式的物件的成員 類外部定義的成員的名字必須包含所屬類名 this本身是乙個常量指標,預設情況下指向非常量版本 在引數列表後加const可以修改this指向常量型別 編譯器首先編譯成員的宣告,然後才輪到...

C Primer 第七章 類

7.2 訪問控制與封裝 7.2.1 訪問說明符 7.2.2 友元 7.3 類的其他特性 7.4 類的作用域 7.5 建構函式高階 7.6 類的靜態成員 類的基本思想 封裝在成員函式內部,任何對類成員的直接訪問都被看做this的隱式掉用,也就是當我們使用成員變數bookno的時候,實際上隱式的使用了t...

C Primer 筆記 第七章 類

類的成員函式通過乙個名為 this 的隱式形參來訪問呼叫它的那個物件,在呼叫時,用請求該函式的物件位址初始化 this,this 是乙個常量指標。要將 this 宣告成指向常量的指標只需在函式的形參列表後加上 const。定義在類內部的函式是隱式的 inline 函式。類外部定義的成員名字必須包含其...