const關鍵字講解

主要概括

const除了修飾常量外,更重要的應用是修飾函數,放在函數不同的位置起到的作用也不同,按照接下來文章以下三部分展開:

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 這個類的任何東西。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章