刷題No3 const

改編自
http://baike.sogou.com/v64494396.htm?fromTitle=CONST
http://blog.csdn.net/lihao21
http://blog.sina.com.cn/s/blog_79b01f6601018xdg.html

  1. const與#define宏定義的對比:
    const可以節(jié)省空間碴犬,避免不必要的內(nèi)存分配。(const是為了消除#define的缺點而產(chǎn)生的)
    例如:
 #define PI 3.14159 //常量宏   
double I=PI; //編譯期間進行宏替換寇壳,分配內(nèi)存          
double J=PI; //再進行宏替換,又一次分配內(nèi)存!
const double Pi=3.14159; //此時并未將Pi放入RAM中
double i=Pi; //此時為Pi分配內(nèi)存,以后不再分配偿乖!      
double j=Pi; //沒有內(nèi)存分配

const定義常量從匯編的角度來看,只是給出了對應(yīng)的內(nèi)存地址哲嘲,而不是像#define一樣給出的是立即數(shù)贪薪,所以,const定義的常量在程序運行過程中只有一份拷貝眠副,而#define定義的常量在內(nèi)存中有若干份拷貝画切。

  1. const常用用法:左定值,右定向
    1)const在前面
const int nValue囱怕; //nValue是const
const char *pContent; //*pContent是const, pContent可變
const char* const pContent; //pContent和*pContent都是const

2)const在后面霍弹,與上面的聲明對等

int const nValue; //nValue是const
char const * pContent; //*pContent是const, pContent可變
char* const pContent; //pContent是const,*pContent可變
char const* const pContent; //pContent和*pContent都是const

const只修飾其后的變量,至于const放在類型前還是類型后并沒有區(qū)別娃弓。如:const int a和int const a都是修飾a為const典格。
3)指針指向的變量的值不能變,指向可變(左定值)

int x = 1;
int y = 2;
const int* px = &x;
int const* px = &x; //這兩句表達式一樣效果
px = &y; //正確台丛,允許改變指向
*px = 3; //錯誤耍缴,不允許改變指針指向的變量的值

4)指針指向的變量的值可以改變,指向不可變(右定向)

int x = 1;
int y = 2;
int* const px = &x;
px = &y; //錯誤挽霉,不允許改變指針指向
*px = 3; //正確防嗡,允許改變指針指向的變量的值

5)指針指向的變量的值不可變,指向不可變

int x = 1;
int y = 2;
const int* const px = &x;
int const* const px = &x;
px = &y; //錯誤侠坎,不允許改變指針指向
*px = 3; //錯誤蚁趁,不允許改變指針指向的變量的值

6)

typedef char * pStr;
char string = "bbc";
const char *p1 =" string"; //1式
const pStr p2 =" string"; //2式
p1++;
p2++;

答案:const使用的基本形式: const type m;限定m不可變。替換基本形式中的m為1式中的*p1实胸,替換后const char *p1;限定*p1不可變荣德,當然p1是可變的闷煤,因此問題中p1++是對的。替換基本形式中的type為2式中的pStr涮瞻,替換后const pStr m;限定m不可變鲤拿,題中的pStr就是一種新類型,因此問題中p2不可 變署咽,p2++是錯誤的近顷。
7)在c中,對于const定義的指針宁否,不賦初值編譯不報錯窒升,
int* const px;這種定義是不允許的。(指針常量定義的時候?qū)ζ溥M行初始化慕匠,右定向饱须,必須指定指針指向)
int const *px;這種定義是允許的。(常指針可以再定義的時候不初始化台谊,左定值蓉媳,可以不賦初值)

  1. const成員函數(shù): 若將成員成員函數(shù)聲明為const,則該函數(shù)不允許修改類的數(shù)據(jù)成員锅铅。
    在C++中酪呻,只有被聲明為const的成員函數(shù)才能被一個const類對象調(diào)用。
const Screen blankScreen;  
blankScreen.display();   // 對象的讀操作  
blankScreen.set(‘*’);    // 錯誤:const類對象不允許修改  

1)值得注意的是盐须,把一個成員函數(shù)聲明為const可以保證這個成員函數(shù)不修改數(shù)據(jù)成員玩荠,但是,如果據(jù)成員是指針贼邓,則const成員函數(shù)可以修改指針指向的對象阶冈。
2)const成員函數(shù)可以訪問非const對象的非const數(shù)據(jù)成員、const數(shù)據(jù)成員塑径,也可以訪問const對象內(nèi)的所有數(shù)據(jù)成員眼溶;
3)非const成員函數(shù)可以訪問非const對象的非const數(shù)據(jù)成員、const數(shù)據(jù)成員晓勇,但不可以訪問const對象的任意數(shù)據(jù)成員;
4)作為一種良好的編程風(fēng)格灌旧,在聲明一個成員函數(shù)時绑咱,若該成員函數(shù)并不對數(shù)據(jù)成員進行修改操作,應(yīng)盡可能將該成員函數(shù)聲明為const 成員函數(shù)枢泰。

  1. 在const成員函數(shù)中描融,用mutable修飾成員變量名后,就可以修改類的成員變量了衡蚂。
  1. 類中的常量:有時我們希望某些常量只在類中有效窿克。由于#define定義的宏常量是全局的骏庸,不能達到目的,于是想當然地覺得應(yīng)該用const修飾數(shù)據(jù)成員來實現(xiàn)年叮。const數(shù)據(jù)成員的確是存在的具被,但其含義卻不是我們所期望的。const數(shù)據(jù)成員只在某個對象生存期內(nèi)是常量只损,而對于整個類而言卻是可變的一姿,因為類可以創(chuàng)建多個對象,不同的對象其const數(shù)據(jù)成員的值可以不同跃惫。
    不能在類聲明中初始化const數(shù)據(jù)成員叮叹。以下用法是錯誤的,因為類的對象未被創(chuàng)建時爆存,編譯器不知道SIZE的值是什么蛉顽。
    class A
    {…
        const int SIZE = 100; // 錯誤,企圖在類聲明中初始化const數(shù)據(jù)成員
        int array[SIZE];       // 錯誤先较,未知的SIZE
    };

const數(shù)據(jù)成員的初始化只能在類構(gòu)造函數(shù)的初始化表中進行携冤,例如

class A
    {…
        A(int size);       // 構(gòu)造函數(shù)
        const int SIZE ;  
    };
    A::A(int size) : SIZE(size) // 構(gòu)造函數(shù)的初始化表
    {
      …
    }
    A  a(100);  // 對象 a 的SIZE值為100
    A  b(200);  // 對象 b 的SIZE值為200

怎樣才能建立在整個類中都恒定的常量呢?別指望const數(shù)據(jù)成員了拇泣,應(yīng)該用類中的枚舉常量來實現(xiàn)噪叙。例如
```
class A
{…
enum { SIZE1 = 100, SIZE2 = 200}; // 枚舉常量
int array1[SIZE1];
int array2[SIZE2];
};

枚舉常量不會占用對象的存儲空間,它們在編譯時被全部求值霉翔。枚舉常量的缺點是:它的隱含數(shù)據(jù)類型是整數(shù)睁蕾,其最大值有限,且不能表示浮點數(shù)(如PI=3.14159)债朵。sizeof(A) = 1200;其中枚舉部長空間子眶。
```enum   EM { SIZE1 = 100, SIZE2 = 200}; // 枚舉常量    sizeof(EM) = 4;```
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末序芦,一起剝皮案震驚了整個濱河市臭杰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谚中,老刑警劉巖渴杆,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宪塔,居然都是意外死亡磁奖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門某筐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來比搭,“玉大人,你說我怎么就攤上這事南誊∩砼担” “怎么了蜜托?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長霉赡。 經(jīng)常有香客問我橄务,道長,這世上最難降的妖魔是什么同廉? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任仪糖,我火速辦了婚禮,結(jié)果婚禮上迫肖,老公的妹妹穿的比我還像新娘锅劝。我一直安慰自己,他們只是感情好蟆湖,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布故爵。 她就那樣靜靜地躺著,像睡著了一般隅津。 火紅的嫁衣襯著肌膚如雪诬垂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天伦仍,我揣著相機與錄音结窘,去河邊找鬼。 笑死充蓝,一個胖子當著我的面吹牛隧枫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谓苟,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼官脓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了涝焙?” 一聲冷哼從身側(cè)響起卑笨,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仑撞,沒想到半個月后赤兴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡隧哮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年桶良,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片近迁。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖簸州,靈堂內(nèi)的尸體忽然破棺而出鉴竭,到底是詐尸還是另有隱情歧譬,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布搏存,位于F島的核電站瑰步,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏璧眠。R本人自食惡果不足惜缩焦,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望责静。 院中可真熱鬧袁滥,春花似錦、人聲如沸灾螃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腰鬼。三九已至嵌赠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間熄赡,已是汗流浹背姜挺。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留彼硫,地道東北人炊豪。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像乌助,于是被迫代替她去往敵國和親溜在。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 1.語言中變量的實質(zhì) 要理解C指針他托,我認為一定要理解C中“變量”的存儲實質(zhì)掖肋, 所以我就從“變量”這個東西開始講起吧...
    金巴多閱讀 1,745評論 0 9
  • (1)可以定義 const 常量 (2)const 可以修飾函數(shù)的參數(shù)、返回值. 詳細內(nèi)容: 1赏参、什么是const...
    幽鬼09閱讀 706評論 0 4
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,513評論 1 51
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,788評論 1 10
  • 車流像追食的螞蟻志笼,閃著焦急的車尾燈 酷暑像女人一樣翻轉(zhuǎn),哭成了涼秋 綿雨霏霏散入柏油馬路的毛孔 音樂也碎了一地把篓,鉆...
    南冠閱讀 147評論 0 1