const用法大集合

C++中的const應用的很靈活,const也大大改善程序的健壯性,下面就const在C++中的各種用法,做一個總結
const的使用地方
1.定義常量
(1)const修飾變量,以下兩種定義形式在本質上是一樣的。它的含義是:const修飾的類型爲TYPE的變量value是不可變的

 TYPE const ValueName = value; 
 const TYPE ValueName = value;

在定義一個變量時用了const,就是常量了,在之後不能改變其值。
有的時候需要使用const變量,他的初始值不是一個常量表達式,但又確實有必要在文件中共享,這種情況下我們不希望編譯器爲每一個文件分別生成獨立的變量,相反的,我們希望這類const對象像其他(非常量)對象一樣工作,也就是說,只要在一個文件中定義了const,而在其他的文件中聲明並使用它。
解決的辦法是:對於const變量不管是申明還是定義都加extern關鍵字,定義一次就可以了

extern const int bufSize = fcn()   //一個文件中

extern const int bufSize //和上面定義的bufSize是同一個

注意:默認狀態下,const對象僅在文件內有效
const對象在定義時必須初始化,因爲const對象在創建後就不能更改它的值
2、指針使用CONST
(1)指針本身是常量不可變

       char* const p;   

這個用const來修飾p,說明指針本身定爲常量,常量指針必須初始化,而且一旦初始化,則它的值(也就是存放在指針裏的地址)就不再改變的了
(2)指針所指向的內容是常量不可變

      const char *p; 

(3)兩者都不可變

         const char* const p; 

頂層const和底層const
頂層const表示指針本身是個常量
底層const表示指針所指的對象是一個常量

int i= 0
int *const p1 = &i   //不能改變p1的值,是頂層const
const int ci = 42    //不能改變ci的值,是頂層const
const int *p2 = &ci   //能改變p2的值,是底層const

(4)還有其中區別方法,沿着*號劃一條線:
如果const位於*的左側,則const就是用來修飾指針所指向的變量,即指針指向爲常量;
如果const位於*的右側,const就是修飾指針本身,即指針本身是常量。
3.const修飾函數系列
1)const修飾函數參數
傳遞過來的參數在函數內不可以改變,與上面修飾變量時的性質一樣

void testModifyConst(const int _x) {
     _x=5;   ///編譯出錯
}

2).const修飾成員函數
(1)const修飾的成員函數不能修改任何的成員變量(mutable修飾的變量除外)
(2)const成員函數不能調用非onst成員函數,因爲非const成員函數可以會修改成員變量

#include <iostream>
  using namespace std;
  class Point{
     public :
     Point(int _x):x(_x){}
     void testConstFunction(int _x) const{
          ///錯誤,在const成員函數中,不能修改任何類成員變量
        x=_x;
         ///錯誤,const成員函數不能調用非onst成員函數,因爲非const成員函數可以會修改成員變量
         modify_x(_x);
     }
     void modify_x(int _x){
         x=_x;
              }
     int x;
 };

3).const修飾函數返回值

(1)指針傳遞
如果返回const data,non-const pointer,返回值也必須賦給const data,non-const pointer。因爲指針指向的數據是常量不能修改

  const int * mallocA(){  ///const data,non-const pointer
      int *a=new int(2);
      return a;
  }
  int main()
  {
      const int *a = mallocA();
      ///int *b = mallocA();  ///編譯錯誤
     return 0;
 }
發佈了46 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章