1 最基本的用法
:a) constint a=100; b的內容不變,b只能是100也就是宣告乙個int型別的常量
(#define b =100)
intconstb=100; //和上面作用一樣
b)const指標和引用一般用在函式的引數中
int* m = &a; //
出錯,常量只能用常指標,如下
int c= 1;
constint*pc = &c;//
常指標可指向常量
constint* pa = &a; //指標指向的內容為常量(就是b的值不變
)intconst*a = &b; //指標指向的內容為常量(就是b的值不變
)*p=3//error
int*consta = &b; //指標為常量,不能更改指標了如a++但可以改值
*p=3;
從這可以看出const放在*左側修飾的是指標的內容,const放在*右側修飾的是指標
本身,呵呵這種記憶方法好
c)const引用的用法和指標一樣
intconst& a=b; 和指標一樣
constint& a=b; 和指標一樣
但沒有int&consta=b 的用法因為引用不能做移位運算,但只是出個warning
d)constint*consta = &b; //綜合應用,一般用來傳遞多維的陣列
類如:char* init = ;
void fun(constint*consta){}
fun(init)//保護引數不被修改
e)int a(int)const; //是常函式,只能用在類中,呼叫它的物件不能改改變成員值
constint a(); //返回的是常量,所以必須這麼呼叫const int a=a();
int a(constint); //引數不能改值,可用在任意函式
int a(constint*);
int height()const;//常函式只能由常函式呼叫
int max(int,int)const;
int max = max(height(),height()); //其中max為常函式
2const和引用聯合使用的時候要注意
a) 強傳const物件可能導致無定義行為
對於優化做的比較好的編譯器,**constint i = 1;
當後面用到變數i 的時候,編譯器會優化掉對i 的訪問,而直接使用立即數1
constint i = 1;
*(const_cast(&i)) = 2;
cout << *(int*)&i << endl;
cout << i << endl;
所以,對const物件做const_cast 可能導致無定義行為
b)不能將const修飾的任何物件、引用和指標作為賦值表示式的左值。
constint cx=100;
constint & rcx=cx;
constint * pcx=&cx;
cx=200; //error
rcx=200; //error
*pcx=200; //error
c).const型別的物件不能直接被non-const型別的別名所引用。
(1)不能將const型別的物件傳遞給non-const型別的引用。
constint cx=100;
int & rx=cx; //error
d)不能將const型別的實參傳遞給形參為non-const型別引用的函式。
void f(int a)
void g(int & ra)
constint cx=100;
f(cx); //ok
g(cx); //error
e)不能將const型別的物件作為non-const型別引用的函式返回值。
int & f(constint & rca)
int x=100;
f(x);
3.可以使用const型別別名引用non-const物件。此時通過const引用不能修改物件,但物件可以通過non-const引用被修改。
int x=100;
int & rx=x;
constint & rcx=x; //ok
x=200;
rx=200;
rcx=200; //error
4.若函式的返回值為內建型別或是指標,則該返回值自動成為const性質。但自定義型別則為non-const性質。
int f() //相當於返回constint
int * g(int & ra) //相當於返回int *const
class ctest
};ctest h() //返回的就是ctest
f()=200; //error
int x=100;
int y=200;
int * px=&x;
g(y)=px; //error
*g(y)=x; //ok,從這點可以看出g()返回的不是constint *
ctest t(100);
h()=t; //ok,但卻是完全錯誤的、危險的做法
//所以h()的正確寫法是返回constctest
5. 常函式的呼叫是這樣的:常量物件只能呼叫常成員函式,非常量物件即可以調常成員函式,也可以調一般成員函式,但當某個函式有const和非const兩個版本時,const物件調const版本,非const物件調非const版本
例:class a
constint & getdata()const
private:
int data;
} a a;
a.getdata();//呼叫int & getdata()
//但如果沒有這個函式,也可以呼叫constint & getdata()const
constaconst_a;
const_a.getdata();//呼叫constint & getdata()const
常函式只能調常函式,也是由於這個原因
extern 用法匯集
帶有extern的變數,其不用加標頭檔案,編譯器會自動去其他檔案中查詢,並進行呼叫。值得注意的兩點 1 帶有初始值的extern宣告,是一種定義 如 extern int ival 10 定義變數ival 等同於 int ival 10 2 extern宣告必須與其定義分屬於不同的檔案 如 exte...
C const用法總結
const名叫常量限定符,用來限定特定變數,以通知編譯器該變數是不可修改的。使用const,可以避免在函式中對某些不應修改的變數造成可能的改動。非const 變數預設為extern,這樣就不可以被程式其它檔案訪問,要想const變數能夠被在其他的檔案中訪問,必須顯式地指定它為extern,如exte...
c const用法總結
看了好多博主寫的關於const的總結,總是仁者見仁,智者見智,好多博主都多多少少的有一些錯誤,在這總結一下c const的用法,我的文章中也可能會有錯誤,望指正!一.定義常量 1 const修飾變數 int const a 5 const int a 5 這兩種定義方法是一樣的,都是不希望a的值發生...