3 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊
C++在函數(shù)聲明時(shí),后面跟個(gè)const是限定函數(shù)類(lèi)型為常成員函數(shù), 常成員函數(shù)是指不能改變成員變量值的函數(shù)。
例如“double d() const;”,其中的其中的“const”限定了d()函數(shù)中不能有任何改變其所屬對(duì)象成員變量值的功能,如果有則會(huì)在編譯階段就報(bào)錯(cuò)。
它的主要作用就是能使成員函數(shù)的意義更加清楚,我們可在不改變對(duì)象的成員函數(shù)的函數(shù)原型中加上const說(shuō)明。在需要增加可讀性和減少邏輯出錯(cuò)的情況下,就可以用這種形式。
擴(kuò)展資料:
簡(jiǎn)單介紹
一、const與define。兩者都可以用來(lái)定義常量,但是const定義時(shí),定義了常量的類(lèi)型,所以更精確一些。#define只是簡(jiǎn)單的文本替換,除了可以定義常量外,還可以用來(lái)定義一些簡(jiǎn)單的函數(shù),有點(diǎn)類(lèi)似內(nèi)聯(lián)函數(shù)(Inline)。const和define定義的常量可以放在頭文件里面。(小注:可以多次聲明,但只能定義一次)
二、》》const與指針和引用。
1、const與指針。
先來(lái)看看下面的幾種定義:
int me;
const int* p1 = &me;//p1可變,*p1不可變,此時(shí)不能用*p1來(lái)修改,但是p1可以轉(zhuǎn)向
int* const p2 = &me;//p2不可變,*p2可變,此時(shí)允許*p2來(lái)修改其值,但是p2不能轉(zhuǎn)向。
const int* const p3 = &me;//p3不可變,*p3也不可變,此時(shí)不能用*p3來(lái)修改其值。
2、指針和引用的區(qū)別很簡(jiǎn)單,就是引用更簡(jiǎn)潔,更安全。因?yàn)橐寐暶鲿r(shí)必須初始化。 引用更接近c(diǎn)onst指針,一旦與某個(gè)變量關(guān)聯(lián),就將一直效忠于他。
3、const指針可以接受const和非const地址,但是非const指針只能接受非const地址。所以const指針的能力更強(qiáng)一些,所以盡量多用const指針,這是一種習(xí)慣。

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
const是一個(gè)C語(yǔ)言(ANSI C)的關(guān)鍵字,具有著舉足輕重的地位。它限定一個(gè)變量不允許被改變,產(chǎn)生靜態(tài)作用。
使用const在一定程度上可以提高程序的安全性和可靠性。另外,在觀看別人代碼的時(shí)候,清晰理解const所起的作用,對(duì)理解對(duì)方的程序也有一定幫助。另外CONST在其它編程語(yǔ)言中也有出現(xiàn),例如Pascal、C++、PHP5、B#.net、HC08 C、C#等。
const的作用:
1、可以定義const常量,具有不可變性。
例如:const int Max=100; Max++會(huì)產(chǎn)生錯(cuò)誤;
2、便于進(jìn)行類(lèi)型檢查,使編譯器對(duì)處理內(nèi)容有更多了解,消除了一些隱患。
例如: void f(const int i) { .........} 編譯器就會(huì)知道i是一個(gè)常量,不允許修改;
3、可以避免意義模糊的數(shù)字出現(xiàn),同樣可以很方便地進(jìn)行參數(shù)的調(diào)整和修改。 同宏定義一樣,可以做到不變則已,一變都變!
如1中,如果想修改Max的內(nèi)容,只需要它修改成:const int Max=you want;即可!
4、可以保護(hù)被修飾的東西,防止意外的修改,增強(qiáng)程序的健壯性。 還是上面的例子,如果在函數(shù)體內(nèi)修改了i,編譯器就會(huì)報(bào)錯(cuò);
例如: void f(const int i) { i=10;//error! }
5、可以節(jié)省空間,避免不必要的內(nèi)存分配。
例如:
#define PI 3.14159 //常量宏
const double Pi=3.14159; //此時(shí)并未將Pi放入ROM中 ......
6、提高了效率。
編譯器通常不為普通const常量分配存儲(chǔ)空間,而是將它們保存在符號(hào)表中,這使得它成為一個(gè)編譯期間的常量,沒(méi)有了存儲(chǔ)與讀內(nèi)存的操作,使得它的效率也很高。
擴(kuò)展資料:
const 的時(shí)候都會(huì)混淆它與 define 的區(qū)別。從功能上說(shuō)它們確實(shí)很像,但它們又有明顯的不同:
1、define是預(yù)編譯指令,而const是普通變量的定義。define定義的宏是在預(yù)處理階段展開(kāi)的,而const定義的只讀變量是在編譯運(yùn)行階段使用的。
2、const定義的是變量,而define定義的是常量。define定義的宏在編譯后就不存在了,它不占用內(nèi)存,因?yàn)樗皇亲兞?,系統(tǒng)只會(huì)給變量分配內(nèi)存。
但const定義的常變量本質(zhì)上仍然是一個(gè)變量,具有變量的基本屬性,有類(lèi)型、占用存儲(chǔ)單元??梢哉f(shuō),常變量是有名字的不變量,而常量是沒(méi)有名字的。
有名字就便于在程序中被引用,所以從使用的角度看,除了不能作為數(shù)組的長(zhǎng)度,用const定義的常變量具有宏的優(yōu)點(diǎn),而且使用更方便。所以編程時(shí)在使用const和define都可以的情況下盡量使用常變量來(lái)取代宏。
3、const定義的是變量,而宏定義的是常量,所以const定義的對(duì)象有數(shù)據(jù)類(lèi)型,而宏定義的對(duì)象沒(méi)有數(shù)據(jù)類(lèi)型。所以編譯器可以對(duì)前者進(jìn)行類(lèi)型安全檢查,而對(duì)后者只是機(jī)械地進(jìn)行字符替換,沒(méi)有類(lèi)型安全檢查。這樣就很容易出問(wèn)題,即“邊際問(wèn)題”或者說(shuō)是“括號(hào)問(wèn)題”。

TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊
const Stock land =Stock("hyd");
land.show();
land 是常量,但是類(lèi)成員函數(shù) show 無(wú)法保證不修改 land,所以編譯器將拒絕執(zhí)行該段代碼。除非你能保證 show 像 const 函數(shù)一樣,但這需要另外一種語(yǔ)法,即:
void show() const; (聲明)
void Stock::show() const {}; (定義)
const 的用法在 C++ 里是很有講究的 參考一下 《Effective C++》吧
以下摘自其中條款三
const 成員函數(shù)
將const 實(shí)施于成員函數(shù)的目的,是為了確認(rèn)該成員函數(shù)可作用于const 對(duì)象身上。這一類(lèi)成員函數(shù)之所以重要,基于兩個(gè)理由。
第一,它們使 class 接口比較容易被理解。這是因?yàn)椋弥膫€(gè)函數(shù)可以改動(dòng)對(duì)象內(nèi)容而哪個(gè)函數(shù)不行,很是重要。
第二,它們使"操作 const 對(duì)象"成為可能。這對(duì)編寫(xiě)高效代碼是個(gè)關(guān)鍵,因?yàn)槿鐥l款 20 所言,改善 C++ 程序效率的一個(gè)根本辦法是以 pass by reference-to-const 方式傳遞對(duì)象,而此技術(shù)可行的前提是,我們有 const 成員函數(shù)可用來(lái)處理取得(并經(jīng)修飾而成)的 const 對(duì)象。
簡(jiǎn)而言之 const 在這里是修飾 函數(shù) 的
- 3 回答
- 0 關(guān)注
- 1533 瀏覽
添加回答
舉報(bào)