在使用#define時,比如#define max 10000,如果出現錯誤,編譯器並不會提示max,因為在預處理階段已經把max替換成了10000,因此編譯器會莫名其妙的提示10000這個數字出現了錯誤,從而不利於程式debug,但是如果使用const int max=10000,編譯器就會準確的提示max有錯誤,從而可以輕易地定位。
對於乙個字元指標的定義char * p;加上const關鍵字時無非有三種方法,即把const放在前中後三個位置。那麼他們之間有什麼區別呢?
1 const char * p1;//表示p1指向了的字串不可更改
2 char const * p2;//同上
3 char * const p3;//表示p2指標的指向不可更改
注意1和2的意義完全相同,只是不同的程式設計師具有不同的編碼習慣,我們要熟悉所有的這三種用法,下面給出一段**,來說明他們三個的區別:
1 #include 2 #include 3 #include4 #include 5 #include 6 #include 7
8using
namespace
std;910
int main(int argc, char *ar**)
1117
18 p1[0] = '
a';//
錯誤!const char * p指向乙個不可改變的物件
19 cout<0]<2021
char
const * p2 = new
char[10
];22 p2[0] = '
a';//
錯誤!同上
23 cout<0]<2425
char ch[5] = "
abcd";
26delete p1;
27 p1 = ch;//
正確 指標的值可以修改
28 cout2930
char * const p3 = new
char[100
];31 p3[0] = '
a';//
正確!32 cout<0
];33
34delete p3;
35 p3 = ch;//
錯誤 指標的值不可以修改
36 cout37 }
在第18行和第22行中,由於指標所指向的物件不可修改,因此會出現錯誤,而在35行處其指標的指向不可修改,因此不可把它指向另乙個位址。
const不僅可以修飾變數,也可以修飾函式,當const修飾函式,例如符過載操作, int & operator (int n) 時有兩個位置可以放置:
1 const int & operator(int n);
2 int & operator(int) const;
前者指其返回值不可修改,例如對於乙個const物件 cint,我們不可以使用cin[0]=3,這種左值的方式對其進行賦值,因為其是乙個const物件,應該不能夠對其內部值進行修改。
而後者的意思是該操作符函式內部不對其物件內部進行修改,是乙個const函式,如果其函式實現對內部成員進行了修改,則會報錯。
對於乙個操作符,我們往往使用過載的方式來實現其const版本和非const版本,在const版本中,如果物件定義為const其內部成員不可修改,否則可以自由修改。例如如下**:
1 #include 2 #include 3 #include4 #include 5 #include 6 #include 7
8using
namespace
std;910
class
myintarray
1122}23
const
int & operator (int n) const
2427
int & operator (int
n) 28
31};
3233
int main(int argc, char *ar**)
34
對於乙個非const物件array我們可以自由的把array[0]作為左值,而對於乙個const物件carray我們則不可以把其作為左值。由此可發現const的強大之處。
C 中的 const 詳解
在使用 define時,比如 define max 10000,如果出現錯誤,編譯器並不會提示max,因為在預處理階段已經把max替換成了10000,因此編譯器會莫名其妙的提示10000這個數字出現了錯誤,從而不利於程式debug,但是如果使用const int max 10000,編譯器就會準確的...
c 中const的用法詳解
const是用於保護程式的健壯性,減少程式隱患。const的用法比較複雜,總結起來又分為以下兩種 1 在定義變數時使用 a const int a 100 最簡單的用法,說明變數a是乙個常變數 b int const b 100 與a功能相同 c const int a b 指向常數的指標,即指標本...
c 中const的使用詳解
const 是c 中常用的型別修飾符,常型別是指使用型別修飾符const說明的型別,常型別的變數或物件的值是不能被更新的。1 定義常量 1 const修飾變數,以下兩種定義形式在本質上是一樣的。它的含義是 const修飾的型別為type的變數value是不可變的。type const valuena...