C const用法匯集(摘)

2021-04-15 15:25:04 字數 4291 閱讀 1797

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的值發生...