一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

C++中const總結(jié)[轉(zhuǎn)]--筆記

 sjyuhusun 2006-01-12
C++中const總結(jié)[轉(zhuǎn)]
閱讀全文(355) | 回復(fù)(1) | 引用通告(0) | 編輯

一、對于基本聲明
1.const int r=100; //標(biāo)準(zhǔn)const變量聲明加初始化,因為默認內(nèi)部連接所以必須被初始化,其作用域為此文件,編譯器經(jīng)過類型檢查后直接用100在編譯時替換。

2.extend const int r=100; //將const改為外部連接,作用于擴大至全局,編譯時會分配內(nèi)存,并且可以不進行初始化,僅僅作為聲明,編譯器認為在程序其他地方進行了定義。

3.const int r[ ]={1,2,3,4};
struct S {int a,b;};
const S s[ ]={(1,2),(3.4)}; //以上兩種都是常量集合,編譯器會為其分配內(nèi)存,所以不能在編譯期間使用其中的值,例如:int temp[r[2]];這樣的編譯器會報告不能找到常量表達式

二、對于指針
1.const int *r=&x; //聲明r為一個指向常量的x的指針,r指向的對象不能被修改,但他可以指向任何地址的常量。

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

3.int * const r=&x; //聲明r為一個常量指針,他指向x,r這個指針的指向不能被修改,但他指向的地址的內(nèi)容可以修改。

4.const int * const r=&x; //綜合1、3用法,r是一個指向常量的常量型指針。

三、對于類型檢查
可以把一個非const對象賦給一個指向const的指針,因為有時候我們不想從這個指針來修改其對象的值;但是不可以把一個const對象賦值給一個非const指針,因為這樣可能會通過這個指針改變指向?qū)ο蟮闹担泊嬖谑惯@種操作通過的合法化寫法,使用類型強制轉(zhuǎn)換可以通過指針改變const對象:
const int r=100;
int * ptr = const_cast(&r); //C++標(biāo)準(zhǔn),C語言使用:int * ptr =(int*)&r;

四、對于字符數(shù)組
如char * name = “china”; 這樣的語句,在編譯時是能夠通過的,但是”china”是常量字符數(shù)組,任何想修改他的操作也能通過編譯但會引起運行時錯誤,如果我們想修改字符數(shù)組的話就要使用char name[ ] = “china”; 這種形式。

五、對于函數(shù)
1.void Fuction1 ( const int r ); //此處為參數(shù)傳遞const值,意義是變量初值不能被函數(shù)改變

2.const int Fuction1 (int); //此處返回const值,意思指返回的原函數(shù)里的變量的初值不能被修改,但是函數(shù)按值返回的這個變量被制成副本,能不能被修改就沒有了意義,它可以被賦給任何的const或非const類型變量,完全不需要加上這個const關(guān)鍵字。但這只對于內(nèi)部類型而言(因為內(nèi)部類型返回的肯定是一個值,而不會返回一個變量,不會作為左值使用),對于用戶自定義類型,返回值是常量是非常重要的,見下面條款3。

3.Class CX; //內(nèi)部有構(gòu)造函數(shù),聲明如CX(int r =0)
CX Fuction1 () { return CX(); }
const CX Fuction2 () { return CX(); }
如有上面的自定義類CX,和函數(shù)Fuction1()和Fuction2(),我們進行如下操作時:
Fuction1() = CX(1); //沒有問題,可以作為左值調(diào)用
Fuction2() = CX(1); //編譯錯誤,const返回值禁止作為左值調(diào)用。因為左值把返回值作為變量會修改其返回值,const聲明禁止這種修改。

4.函數(shù)中指針的const傳遞和返回:
int F1 (const char * pstr); //作為傳遞的時候使用const修飾可以保證不會通過這個指針來修改傳遞參數(shù)的初值,這里在函數(shù)內(nèi)部任何修改*pstr的企圖都會引起編譯錯誤。
const char * F2 (); //意義是函數(shù)返回的指針指向的對象是一個const對象,它必須賦給一個同樣是指向const對象的指針。
const char * const F3(); //比上面多了一個const,這個const的意義只是在他被用作左值時有效,它表明了這個指針除了指向const對象外,它本身也不能被修改,所以就不能當(dāng)作左值來處理。

5.函數(shù)中引用的const傳遞:
void F1 ( const X& px); //這樣的一個const引用傳遞和最普通的函數(shù)按值傳遞的效果是一模一樣的,他禁止對引用的對象的一切修改,唯一不同的是按值傳遞會先建立一個類對象的副本,然后傳遞過去,而它直接傳遞地址,所以這種傳遞比按值傳遞更有效。
**另外只有引用的const傳遞可以傳遞一個臨時對象,因為臨時對象都是const屬性,且是不可見的,他短時間存在一個局部域中,所以不能使用指針,只有引用的const傳遞能夠捕捉到這個家伙。

六、對于類
1.首先,對于const的成員變量,只能在構(gòu)造函數(shù)里使用初始化成員列表來初始化,試圖在構(gòu)造函數(shù)體內(nèi)進行初始化const成員變量會引起編譯錯誤。初始化成員列表形如:
2.X:: X ( int ir ): r(ir) {} //假設(shè)r是類X的const成員變量

2.const成員函數(shù)。提到這個概念首先要談到const對象,正象內(nèi)置類型能夠定義const對象一樣(const int r=10;),用戶自定義類型也可以定義const對象(const X px(10);),編譯器要保證這個對象在其生命周期內(nèi)不能夠被改變。如果你定義了這樣的一個const對象,那么對于這個對象的一切非const成員函數(shù)的調(diào)用,編譯器為了保證對象的const特性,都會禁止并在編譯期間報錯。所以如果你想讓你的成員函數(shù)能夠在const對象上進行操作的話,就要把這個函數(shù)聲明為const成員函數(shù)。假如f( )是類中的成員函數(shù)的話,它的聲明形如:
int f( ) const; //const放在函數(shù)的最后,編譯器會對這個函數(shù)進行檢查,在這個函數(shù)中的任何試圖改變成員變量和調(diào)用非const成員函數(shù)的操作都被視為非法
注意:類的構(gòu)造和析構(gòu)函數(shù)都不能是const函數(shù)。

3.建立了一個const成員函數(shù),但仍然想用這個函數(shù)改變對象內(nèi)部的數(shù)據(jù)。這樣的一個要求也會經(jīng)常遇到,尤其是在一個苛刻的面試考官那里。首先我們要弄清楚考官的要求,因為有兩種方法可以實現(xiàn),如果這位考官要求不改變原來類的任何東西,只讓你從當(dāng)前這個const成員函數(shù)入手,那么你只有使用前面提到的類型強制轉(zhuǎn)換方法。實例如下:
//假如有一個叫做X的類,它有一個int成員變量r,我們需要通過一個const成員函數(shù)f( )來對這個r進行++r操作,代碼如下
void X::f( ) const
{ (const_cast(this)) -> ++r; } //通過this指針進行類型強制轉(zhuǎn)換實現(xiàn)
另外一種方法就是使用關(guān)鍵字:mutable。如果你的成員變量在定義時是這個樣子的:
mutable int r ;
那么它就告訴編譯器這個成員變量可以通過const成員函數(shù)改變。編譯器就不會再理會對他的檢查了。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    久久精品免费视看国产成人| 免费性欧美重口味黄色| 日本女优一色一伦一区二区三区| 国产对白老熟女正在播放| 日韩精品免费一区二区三区| 亚洲国产中文字幕在线观看| 精品国产一区二区欧美| 69久久精品亚洲一区二区| 久热这里只有精品九九| 一区二区免费视频中文乱码国产| 亚洲国产精品久久琪琪| 日本午夜免费福利视频| 丝袜视频日本成人午夜视频| 亚洲欧美中文日韩综合| 国产精品香蕉免费手机视频| 亚洲另类欧美综合日韩精品| 欧美乱妇日本乱码特黄大片 | 国产一区二区三区色噜噜| 欧美野外在线刺激在线观看| 亚洲av专区在线观看| 日本一区不卡在线观看| 国产精品尹人香蕉综合网 | 国产一级特黄在线观看| 国产欧美日韩在线一区二区| 丰满的人妻一区二区三区| 美女极度色诱视频在线观看| 九九久久精品久久久精品| 在线观看视频日韩精品 | 亚洲妇女黄色三级视频| 中文字幕乱码一区二区三区四区| 成年人视频日本大香蕉久久| 日韩特级黄片免费在线观看| 欧美日韩亚洲国产精品| 日本久久精品在线观看| 欧美成人久久久免费播放| 少妇淫真视频一区二区| 午夜福利激情性生活免费视频| 日本中文字幕在线精品| 国产一区二区不卡在线播放| 成人日韩在线播放视频| 欧美一区二区三区视频区|