const修飾規則 及其 用法

const指針和指向const變量的指針,在寫法上容易讓人混淆,記住一個規則:從左至右,依次結合,const就近結合函數


好比,int * const p:
1.int * (const p):變量p通過Const修飾,爲只讀變量
2.int (*(const p)):(const p)做爲一個總體成爲一個只讀指針指向int型變量
3.(int(*(const p))):(*const p)做爲一個總體,只讀指針p指向Int型變量
因而,int * const p:一個指向整型變量的Const型指針spa


再好比, const int *p:
1.const int (*p):變量p是一個指針
2. (const int) (*p): (const就近結合)變量p指向一個const類型的整型
因而,const int *p: 一個指向const整型變量的指針指針

 

用法:

1.用於定義常量變量,這樣這個變量在後面就不能夠再被修改對象

 const int Val = 10; 內存

 //Val = 20; //錯誤,不可被修改編譯

 

2. 保護傳參時參數不被修改,若是使用引用傳遞參數或按地址傳遞參數給一個函數,在這個函數裏這個參數的值若被修改,class

則函數外部傳進來的變量的值也發生改變,若想保護傳進來的變量不被修改,可使用const保護效率

 void  fun1(const int &val)變量

  {file

     //val = 10; //出錯

}

void fun2(int &val)

{

   val = 10; //沒有出錯

}

void main()

{

   int a = 2;

   int b = 2;

   fun1(a); //由於出錯,這個函數結束時a的值仍是2

   fun2(b);//由於沒有出錯,函數結束時b的值爲10

}

若是隻想把值傳給函數,並且這個不能被修改,則可使用const保護變量,有人會問爲何不按值傳遞,按值傳遞還須要把這個值複製一遍,

而引用不須要,使用引用是爲了提升效率//若是按值傳遞的話,不必加const,那樣根本沒意義

 

3. 節約內存空間,

 #define  PI  3.14 //使用#define宏

 const double Pi = 3.14 //使用const,這時候Pi並無放入內存中

 

 double  a = Pi;  //這時候才爲Pi分配內存,不事後面再有這樣的定義也不會再分配內存

 double  b = PI;  //編譯時分配內存

 double  c = Pi;  //不會再分配內存,

 double  d = PI;  //編譯時再分配內存

const定義的變量,系統只爲它分配一次內存,而使用#define定義的常量宏,能分配好屢次,這樣const就很節約空間

4.類中使用const修飾函數防止修改非static類成員變量, 普通的成員變量在const修飾的成員函數中都不能進行修改.彷彿只能用在類函數中不能修飾普通的函數體.

 class

{

 public:

  void fun() const //加const修飾

   {

     a = 10; //出錯,不可修改非static變量

     b = 10; //對,能夠修改

}

 private:

  int  a ;

  static int b;

}

 

6.修飾函數返回值,防止返回值被改變

 

  const int fun();

 

  接收返回值的變量也必須加const

 

  const int a = fun(); //接收的變量也要是const的,int a = fun()是錯誤的

 

7.修飾類的成員變量

 

  使用const修飾的變量必須初始化,在類中又不能在定義時初始化,

 

如;

 

class

 

{

 

private:

 

  int a = 10;

 

  const int b = 10;

 

  static const int c = 10;

 

//這樣初始化都是錯的,

 

}

 

 

 

初始化const int類型(沒有static),在類的構造函數上初始化

 

Class Test

 

{

 

Public:

 

  Test():b(23) //構造函數上初始化b的值爲23

 

   {

 

}

 

private:

 

     const int b ;

 

}

 

 

 

初始化staticconst int這個類型的(帶有static的),在類的外面初始化

 

class Test

 

{

 

private:

 

  static const int c;

 

} 

 

const int Test::c=10; //類的外部初始化c爲10

 

8.const定義的對象變量只能做用於這個程序該C/C++文件,不能被該程序的其餘C/C++文件調用,

 

 如file1.cpp中 const int val;

 

 在file2.cpp中, extern intval; //錯誤,沒法調用,

 

要想const定義的對象變量能被其餘文件調用,定義時必須使用extern修飾爲

 

extern const int val;

 

 

 

非const變量默認爲extern,要是const能被其餘文件訪問必須顯示指定爲extern

相關文章
相關標籤/搜索