程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> const in C/C++,constin

const in C/C++,constin

編輯:C++入門知識

const in C/C++,constin


1.const 對象必須初始化,因為一旦創建後值不能改變。

Eg:

  const int i = GetSize(); //正確:運行時初始化

  const int j = 42;   //正確:編譯時初始化

  j = 33;   //錯誤:試圖向const對象寫值

  const int k;         //錯誤:k是一個未經初始化的常量

 

2.默認狀態下,const對象僅在文件內有效。

若想在多個文件內工作,只在一個文件中定義const,而在其他多個文件中聲明並使用它。

解決辦法,對於const變量,不論聲明定義都加extern,這樣只需定義一次即可。

Eg:

  //file1.cc 定義並初始化一個常量,該常量能被其他文件訪問

  Extern const int bufSize = fcn();

  //file1.h

  Extern const int bufSize; //與file1.cc 中定義的bufSize是同一個

 

3.把引用綁定到const對象上,稱之為 對常量的引用

Eg1:

  const int c = 1024;    

  const int &r1 = c;    //正確

  r1 = 42;       //錯誤:r1是對常量的引用

  int &r2 = c;       //錯誤:試圖讓一個非常量引用指向一個常量引用

 

Eg2:  int i = 42;

          const int &r1 = i; //允許將const int& 綁定到一個普通int上

          const int &r2 = 42;    //正確:r2是一個常量引用

          const int &r3 = r1*2;   //正確:r3是一個常量引用

          int &r4 = r1 * 2;      //錯誤:r4是一個普通的非常量引用

 

對const引用可能引用一個非const對象

Eg:   int i = 42;

         int &r1 = i;

         const int &r2 = i; //r2綁定對象i,但不允許通過r2修改i值

         r1 = 0; //r1並非常量,i的值為0

         r2 = 0; //錯誤:r2是一個常量引用

引用一個非const對象,即對象是個非常量,所以允許通過其他途徑改變其值。

 

4.const指針

指針是對象,允許把指針本身定為常量。常量指針必須初始化,則指針的值(存放指針中的地址)不能再改變了。

把*放在const前,用以說明指針是一個常量,即不變的是指針本身而非指向的值。

Eg: int errNumb = 0;

          int *const curErr = &errNumb; //curErr將一直指向errNumb

          const double pi = 3.14159;

          const double *const pip = π   //pip指向常量對象的常量指針

從右往左讀:

①離curErr最近的是const,意味著curErr本身是一個常量對象。

②下一個是*,curErr是一個常量指針。

③int:常量指針指向一個int對象

同理,pip是一個常量指針,指向一個雙精度浮點型常量。

 

指針本身是一個常量並不意味著不能通過指針修改其所指對象的值。

 

Eg:分析int const *p,  const int*p,  int *const p , const int *const p的異同之處

int const *p,  const int*p這兩個沒區別,p指向的地址可變,p指向的內容不可變,

int *const p , p指向的地址不可變,p指向的內容可變

const int *const p  p指向的地址不可變,p指向的內容不可變

 

5.頂層const

頂層const 表示指針本身是個常量。

底層const 表示指針所指的對象是一個常量。

Eg:int i = 0;

  int *const p1 = &i; //不能改變p1值,頂層

  const int ci = 42; //不能改變ci值,頂層

  const int *p2 = &ci;     //允許改變p2值,底層

  const int *const p3 = p2;    //靠右的const頂層,靠左底層

  const int & r =ci; //用於聲明引用的const都是底層const

 

執行對象拷貝操作:

頂層const不受影響:不會改變被拷貝對象的值,無影響。

Eg: i = ci; //正確:拷貝ci值,ci頂層const,無影響

          p2 =p3; //正確:p2 p3指向對象類型相同。p3頂層const的部分不影響

 

底層const 限制不可忽略:執行對象拷貝操作,拷入拷出對象必須具有相同底層const資格,或者兩個對象的數據類型必須能夠轉換。一般,非常量可以轉換成常量,反之不行。

Eg: int *p = p3; //錯誤:p3包含底層const,p1無

          p2 = p3; //正確:p2 p3 都是底層const

          p2 = &i; //正確:int * 能轉換成 const int *

          int &r = ci; //錯誤:試圖讓一個非常量引用指向一個常量引用

          const int &r2 = i; //正確:r2綁定對象i,但不允許通過r2修改i值

          //(對const引用可能引用一個非const對象)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved