const的相關資料

2021-04-13 22:14:13 字數 3937 閱讀 7096

內容引自csdn裡的一帖(http://topic.csdn.net/u/20071106/11/822b2bd6-bccd-455b-b60a-0c94f28ee82d.html)

c++中const總結

一:對於基本宣告

1.const   int   r=100;  

//標準const變數宣告加初始化,因為預設內部連線所以必須被初始化,其作用域

為此檔案,編譯器經過型別檢查後直接用100在編譯時替換.

2.extend   const   int   r=100;  

//將const改為外部連線,作用於擴大至全域性,編譯時會分配記憶體,並且可以不進行

初始化,僅僅作為宣告,編譯器認為在程式其他地方進行了定義.

3.const   int   r=;

struct   s   ;

const   s   s=;

//以上兩種都是常量集合,編譯器會為其分配記憶體,所以不能在編譯期間使用其中

的值,例如:int   temp[r[2]];這樣的編譯器會報告不能找到常量表示式

二:對於指標

1.const   int   *r=&x;  

//宣告r為乙個指向常量的x的指標,r指向的物件不能被修改,但他可以指向任何

位址的常量.

2.int   const   *r=&x;//與用法1完全等價,沒有任何區別。

3.int   *   const   r=&x;  

//宣告r為乙個常量指標,他指向x,r這個指標的指向不能被修改,但他指向的位址

的內容可以修改.

4.const   int   *   const   r=&x;  

//綜合1,3用法,r是乙個指向常量的常量型指標.

三:對於型別檢查

可以把乙個非const物件賦給乙個指向const的指標,因為有時候我們不想從這個

指標來修改其物件的值,但是不可以把乙個const物件賦值給乙個非const指標,

因為這樣可能會通過這個指標改變指向物件的值,但也存在使這種操作通過的合

法化寫法,使用型別強制轉換可以通過指標改變const物件:

const   int   r=100;

int   *ptr=const_cast (&r);//c++標準,c語言使用:int*   ptr   =(int*)&r;

四:對於字元陣列

如char   *   name   =   "china ";  

這樣的語句,在編譯時是能夠通過的,但是 "china "是常量字元陣列,任何想修改

他的操作也能通過編譯但會引起執行時錯誤,如果我們想修改字元陣列的話就要

使用char   name= "china ";這種形式.

五:對於函式

1.void   fuction1(const   int   r);

//此處為引數傳遞const值,意義是變數初值不能被函式改變

2.const   int   fuction1(int);  

//此處返回const值,意思指返回的原函式裡的變數的初值不能被修改,但是函式

按值返回的這個變數被製成副本,能不能被修改就沒有了意義,它可以被賦給任何

的const或非const型別變數,完全不需要加上這個const關鍵字.但這只對於內部

型別而言(因為內部型別返回的肯定是乙個值,而不會返回乙個變數,不會作為左

值使用),對於使用者自定義型別,返回值是常量是非常重要的,見下面條款3

3.class   cx;   //內部有建構函式,宣告如cx(int   r   =0)

cx   fuction1   ()  

const   cx   fuction2   ()  

如有上面的自定義類cx,和函式fuction1()和fuction2(),我們進行如下操作時:

fuction1()=cx(1);   //沒有問題,可以作為左值呼叫

fuction2()=cx(1);   //編譯錯誤,const返回值禁止作為左值呼叫.因為左值

把返回值作為變數會修改其返回值,const宣告禁止這種修改.

4.函式中指標的const傳遞和返回

int   f1   (const   char   *   pstr);  

//作為傳遞的時候使用const修飾可以保證不會通過這個指標來修改傳遞引數的

初值,這裡在函式內部任何修改*pstr的企圖都會引起編譯錯誤.

const   char*   f2();  

//意義是函式返回的指標指向的物件是乙個const物件,它必須賦給乙個同樣是指

向const物件的指標.

const   char*   const   f3();  

//比上面多了乙個const,這個const的意義只是在他被用作左值時有效,它表明這

個指標除了指向const物件外,它本身也不能被修改,所以就不能當作左值來處理.

5.函式中引用的const傳遞

void   f1   (const   x&   px);  

//這樣的乙個const引用傳遞和最普通的函式按值傳遞的效果是一模一樣的,他禁

止對引用的物件的一切修改,唯一不同的是按值傳遞會先建立乙個類物件的副本,

然後傳遞過去,而它直接傳遞位址,所以這種傳遞比按值傳遞更有效.

另外只有引用的const傳遞可以傳遞乙個臨時物件,因為臨時物件都是const屬性,

且是不可見的,他短時間存在乙個區域性域中,所以不能使用指標,只有引用的const

傳遞能夠捕捉到這個傢伙.

六:對於類

1.首先,對於const的成員變數,只能在建構函式裡使用初始化成員列表來初始化,

試圖在建構函式體內進行初始化const成員變數會引起編譯錯誤.初始化成員列表

形如:x::x(int   ir):r(ir){}   //假設r是類x的const成員變數

2.const成員函式.提到這個概念首先要談到const物件,正象內建型別能夠定義

const物件一樣(const   int   r=10;),使用者自定義型別也可以定義const物件

(const   x   px(10);),編譯器要保證這個物件在其生命週期內不能夠被改變.如果

你定義了這樣的乙個const物件,那麼對於這個物件的一切非const成員函式的調

用,編譯器為了保證物件的const特性,都會禁止並在編譯期間報錯.所以如果你想

讓你的成員函式能夠在const物件上進行操作的話,就要把這個函式宣告為const

成員函式.

假如f()是類中的成員函式的話,它的宣告形如:

int   f()const;  

//const放在函式的最後,編譯器會對這個函式進行檢查,在這個

函式中的任何試圖改變成員變數和呼叫非const成員函式的操作都被視為非法

注意:類的構造和析構函式都不能是const函式.

3.建立了乙個const成員函式,但仍然想用這個函式改變物件內部的資料.這樣的

乙個要求也會經常遇到,尤其是在乙個苛刻的面試考官那裡.首先我們要弄清楚考

官的要求,因為有兩種方法可以實現,如果要求不改變原來類的任何東西,只讓你從

當前這個const成員函式入手,那麼你只有使用前面提到的型別強制轉換方法.例項

如下:

//假如有乙個叫做x的類,它有乙個int成員變數r,我們需要通過乙個const成員函

數f()來對這個r進行++r操作,**如下:

void   x::f()const

//通過this指標進行型別強制轉換實現

另外一種方法就是使用關鍵字:mutable.

如果你的成員變數在定義時是這個樣子的:mutable   int   r;

那麼它就告訴編譯器這個成員變數可以通過const成員函式改變.編譯器就不會再

理會對他的檢查了 

const相關,指標相關,陣列相關

include include head.h int a 3,c 2 const int b a b 8 error b c right const用來修飾指標所指向的變數,還是指標 可以修改指標指向位址,但不能直接修改指向內容 int const b a b 8 right p error con...

跟const相關的函式過載

class p 這些竟然都算是過載,我也是醉了!一般情況下,無const修飾的宣告,函式呼叫時,必須有變數名,不能使用字面值,且型別必須是宣告型別,不會進行型別轉換,否則出錯。對於宣告為 int increase int val int a 1 int b 2 double c 3 const in...

const資料整理

一 const作用 1 便於型別檢查,const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤。2 可以保護被修飾的東西,防止意外的修改,增強程式的健壯性。3 可以方便的進行變數修改,同巨集...