- N +

const關鍵字的作用,const關鍵字的用法

const的用法和意義

(1)欲阻止一個變量被改變,可以使用const關鍵字。在定義該const變量時,通常需要對它進行初始化,因為以后就沒有機會再去改變它了;

(2)對指針來說,可以指定指針本身為const,也可以指定指針所指的數據為const,或二者同時指定為const;

(3)在一個函數聲明中,const可以修飾形參,表明它是一個輸入參數,在函數內部不能改變其值;

(4)對于類的成員函數,若指定其為const類型,則表明其是一個常函數,不能修改類的成員變量;

(5)對于類的成員函數,有時候必須指定其返回值為const類型,以使得其返回值不為“左值”。例如:

constclassAoperator*(constclassA&a1,constclassA&a2);

operator*的返回結果必須是一個const對象。如果不是,這樣的變態代碼也不會編譯出錯:

classAa,b,c;

(a*b)=c;//對a*b的結果賦值

操作(a*b)=c顯然不符合編程者的初衷,也沒有任何意義。

能介紹一下const的所有用法

const關鍵字至少有下列n個作用:

(1)欲阻止一個變量被改變,可以使用const關鍵字。在定義該const變量時,通常需要對它進行初始化,因為以后就沒有機會再去改變它了;

(2)對指針來說,可以指定指針本身為const,也可以指定指針所指的數據為const,或二者同時指定為const;

(3)在一個函數聲明中,const可以修飾形參,表明它是一個輸入參數,在函數內部不能改變其值;

(4)對于類的成員函數,若指定其為const類型,則表明其是一個常函數,不能修改類的成員變量;

(5)對于類的成員函數,有時候必須指定其返回值為const類型,以使得其返回值不為“左值”。例如:

constclassAoperator*(constclassA&a1,constclassA&a2);

operator*的返回結果必須是一個const對象。如果不是,這樣的變態代碼也不會編譯出錯:

classAa,b,c;

(a*b)=c;//對a*b的結果賦值

操作(a*b)=c顯然不符合編程者的初衷,也沒有任何意義。

const用法

const關鍵字至少有下列n個作用:

(1)欲阻止一個變量被改變,可以使用const關鍵字。在定義該const變量時,通常需要對它進行初始化,因為以后就沒有機會再去改變它了;

(2)對指針來說,可以指定指針本身為const,也可以指定指針所指的數據為const,或二者同時指定為const;

(3)在一個函數聲明中,const可以修飾形參,表明它是一個輸入參數,在函數內部不能改變其值;

(4)對于類的成員函數,若指定其為const類型,則表明其是一個常函數,不能修改類的成員變量;

(5)對于類的成員函數,有時候必須指定其返回值為const類型,以使得其返回值不為“左值”。例如:

constclassAoperator*(constclassA&a1,constclassA&a2);

operator*的返回結果必須是一個const對象。如果不是,這樣的變態代碼也不會編譯出錯:

classAa,b,c;

(a*b)=c;//對a*b的結果賦值

操作(a*b)=c顯然不符合編程者的初衷,也沒有任何意義。

關鍵字static、Const、Volatile的作用是什么

在C語言中,關鍵字static有三個明顯的作用:1).在函數體,一個被聲明為靜態的變量在這一函數被調用過程中維持其值不變。

2).在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。3).在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地范圍內使用。大多數應試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個應試者的嚴重的缺點,因為他顯然不懂得本地化數據和代碼范圍的好處和重要性。我只要一聽到被面試者說:“const意味著常數”,我就知道我正在和一個業余者打交道。去年DanSaks已經在他的文章里完全概括了const的所有用法,因此ESP(譯者:EmbeddedSystemsProgramming)的每一位讀者應該非常熟悉const能做什么和不能做什么.如果你從沒有讀到那篇文章,只要能說出const意味著“只讀”就可以了。盡管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)如果應試者能正確回答這個問題,我將問他一個附加的問題:下面的聲明都是什么意思?constinta;intconsta;constint*a;int*consta;intconst*aconst;前兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)。第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。最后一個意味著a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。如果應試者能正確回答這些問題,那么他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關鍵字const,也還是能很容易寫出功能正確的程序,那么我為什么還要如此看重關鍵字const呢?我也如下的幾下理由:2).通過給優化器一些附加的信息,使用關鍵字const也許能產生更緊湊的代碼。3).合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個例子:1).并行設備的硬件寄存器(如:狀態寄存器)2).一個中斷服務子程序中會訪問到的非自動變量(Non-automaticvariables)3).多線程應用中被幾個任務共享的變量假設被面試者正確地回答了這是問題(嗯,懷疑這否會是這樣),我將稍微深究一下,看一下這家伙是不是直正懂得volatile完全的重要性。intsquare(volatileint*ptr){return*ptr**ptr;}下面是答案:1).是的。一個例子是只讀的狀態寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應該試圖去修改它。2).是的。盡管這并不很常見。一個例子是當一個中服務子程序修該一個指向一個buffer的指針時。3).這段代碼的有個惡作劇。這段代碼的目的是用來返指針*ptr指向值的平方,但是,由于*ptr指向一個volatile型參數,編譯器將產生類似下面的代碼:intsquare(volatileint*ptr){inta,b;a=*ptr;b=*ptr;returna*b;}由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:

const intint區別

區別是使用國家不一樣。const與intint的意思一樣都是常數的意思。不一樣在于使用const單詞的國家主要有英國,而使用intint的國家主要有美國,加拿大,澳大利亞。

函數后加const啥意思

c++在函數后加const的意義:我們定義的類的成員函數中,常常有一些成員函數不改變類的數據成員,也就是說,這些函數是"只讀"函數,而有一些函數要修改類數據成員的值。如果把不改變數據成員的函數都加上const關鍵字進行標識,顯然,可提高程序的可讀性。其實,它還能提高程序的可靠性,已定義成const的成員函數,一旦企圖修改數據成員的值,則編譯器按錯誤處理。const成員函數和const對象實際上,const成員函數還有另外一項作用,即常量對象相關。對于內置的數據類型,我們可以定義它們的常量,用戶自定義的類也一樣,可以定義它們的常量對象。

返回列表
上一篇:
下一篇: