const關鍵字講解

2021-10-07 00:01:25 字數 1858 閱讀 6060

主要概括

const修飾函式引數

const修飾函式返回值

const修飾this指標

const修飾函式引數

int getval(int arg,const sale_item &item);

sale_item 是乙個使用者自定義類, sale_item  &item表示 sale_item 以引用的方式建立乙個物件。這裡可能有人就有疑問了。為什麼要用引用的方式呢?平常我們不是直接建立乙個物件就完了嗎?就像下面這樣。

sale_item item;

我們平常在main函式裡建立物件確實是這樣的,但是這裡是有區別的哦?main函式裡面建立物件構建就一次,不會重複構建,但是函式是會被多次呼叫的,如果寫成以下情況:

int getval(int arg,sale_item item);

那麼每次呼叫一次函式就會構建乙個物件,每次都會產生乙個臨時物件,臨時物件的構造、拷貝和析構都很耗時間,影響效率;而引用傳遞不是值傳遞,不會涉及拷貝這種操作就像乙個東西貼上不同的標籤,雖然根據標籤有不同的叫法,但總歸是一樣東西。所以也不會產生臨時物件。但這時有乙個問題,就是如果我更改了乙個引用物件,那不是牽一髮而動全身,全部都改了?

說的沒錯,為了避免這種情況的發生,我們就使用了const來修飾,保證了這個引用物件是不可修改的,進而解決了這個問題,所以就有了一開始的那行**。

const修飾函式返回值

const char* getid()

指標返回加const代表const代表函式返回值(指標)不能被修改。並且該返回值只能賦值給const修飾同型別指標。如:

const  char* id =getid();

當然也不用再內建資料型別返回時加const,如下的是沒必要的;

const int getnum();

理由同上,函式返回值會賦值到外部的臨時儲存空間內。總之,只要記住const是起到保護資料作用的,而複製操作本身就保證了資料的安全性,所以沒有必要多此一舉。返回引用可以加const為常量引用。如下:

const item &getval();

const修飾this指標

this 指標本身是類成員函式的乙個隱性引數;如下

sale_item() const

其實這行**表示 sale_item 這個類的乙個建構函式。const 修飾的是 this 指標,為什麼把它寫在外面呢?

因為 this 指標是隱性引數,也就是說不能在函式引數裡面直接定義這個引數,但是在構建成員函式的時候又會附帶上這個 this 指標。

就像我們平常買一些進口食品,我們買這些進口食品除了支付它的價值外,還要承擔一定的關稅,這個關稅我們平常看不見摸不著,但是它確確實實存在的。this 指標就像這個關稅,看不見但又確實存在。這個比喻可能比較牽強,但是大概這個意思,this 指標是隱性的。因為 this 指標是隱性的,那我們如果要用 const 修飾 this 指標所指的物件,只能把 const 加在函式末尾。這裡強調一下,this 指標本身是乙個常量指標,它指向的位址就是乙個常量位址。比如上面的**,this 指標指向 sale_item 類的位址,這個位址是乙個常量,類建立後就不會改變。而加上 const 後這個成員函式就不能修改 sale_item 這個類的任何東西。

const關鍵字用法

1 const常量 如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤 邊際效應 2 const修飾類的資料成員 class a const...

關鍵字const詳解

關鍵字const 1 用關鍵字const定義變數指所定義的常量。即恆定的變數,即不可改變的變數。例 const int i 10 此時 i 就是乙個整型的常量,其值不能改變。在c 中如果用const定義乙個物件,那麼物件中的成員變數就是常數,不能改變 只能為初始化的值 如果用const定義類中的成員...

const關鍵字用法

const修飾符表示該變數的值不能被改變。但得分兩種情況討論 修飾普通變數和修飾指標變數。1.普通常量 const int foo 5 表示foo不能再被賦值 foo 8 錯誤,因為foo是const修飾為不可變常量了 2.修飾指標 const char p test 表示p指向 的記憶體不可改變,...