1樓:
用來修飾變數或函式(包括成員函式)及其引數:
(1)const修飾基本資料型別
(2)const應用到函式中
(3)const在類中的用法
(4)const修飾類物件,定義常量物件
一、const修飾基本資料型別
1.const修飾一般常量及陣列
const int a=10; 等價的書寫方式: int const a=10;
const int arr[3]=; int const arr[3]=;
對於類似這些基本資料型別,修飾符const可以用在型別說明符前,也可以用在型別說明符後,其結果是一樣的。在使用這些常量的時候,只要不改變這些常量的值便好。
2.const修飾指標變數*及引用變數&
介紹本部分內容之前,先說說指標和引用的一些基本知識。
指標(pointer)是用來指向實際記憶體位址的變數,一般來說,指標是整型,而且一般的大家會接受十六進製制的輸出格式。
引用(reference)是其相應變數的別名,用於向函式提供直接訪問引數(而不是引數的副本)的途徑,與指標相比,引用是一種受限制的指標型別,或者說是指標的乙個子集,而從其功能上來看,似乎可以說引用是指標功能的一種高層實現。
關於運算子&和*:
在c++裡,沿襲c中的語法,有兩個一元運算子用於指標操作:&和*。按照本來的定義,&應當是取址符,*是指標符,也就是說, &用於返回變數的實際位址,*用於返回位址所指向的變數,他們應當互為逆運算。
實際的情況也是如此。
在定義變數的引用的時候,&只是個定義引用的標誌,不代表取位址。
***************************const修飾指標(*):*********************
const int* a = & [1] //非常量資料的常量指標 指標常量
int const *a = & [2] //非常量資料的常量指標 a is a pointer to the constant char variable
int* const a = & [3] //常量資料的非常量指標指標常量 常量指標 a is a constant pointer to the (non-constant) char variable
const int* const a = & [4] //常量資料的常量指標
可以參考《effective c++》item21上的做法,
如果const位於星號*的左側,則const就是用來修飾指標所指向的變數,即指標指向為常量;
如果const位於星號的右側,const就是修飾指標本身,即指標本身是常量。
因此,[1]和[2]的情況相同,都是指標所指向的內容為常量,這種情況下不允許對內容進行更改操作,如不能*a = 3 ;
[3]為指標本身是常量,而指標所指向的內容不是常量,這種情況下不能對指標本身進行更改操作,如a++是錯誤的;
[4]為指標本身和指向的內容均為常量。
****************const修飾引用(&):***************************
int const &a=x;
const int &a=x;
int &const a=x;//這種方式定義是c、c++編譯器未定義,雖然不會報錯,但是該句效果和int &a一樣。
這兩種定義方式是等價的,此時的引用a不能被更新。如:a++ 這是錯誤的。
二、const應用到函式中
1.作為引數的const修飾符
2.作為函式返回值的const修飾符
其實,不論是引數還是返回值,道理都是一樣的,引數傳入時候和函式返回的時候,初始化const變數
1 修飾引數的const,如 void fun0(const a* a ); void fun1(const a& a);
呼叫函式的時候,用相應的變數初始化const常量,則在函式體中,按照const所修飾的部分進行常量化,如形參為const a* a,
則不能對傳遞進來的指標的內容 進行改變,保護了原指標所指向的內容;如形參為const a& a,則不能對傳遞進來的引用物件進行改變,
保護了原物件的屬性。
[注意]:引數const通常用於引數為指標或引用的情況;
2 修飾返回值的const,如const a fun2( ); const a* fun3( );
這樣宣告了返回值後,const按照"修飾原則"進行修飾,起到相應的保護作用。
const rational operator*(const rational& lhs, const rational& rhs)
返回值用const修飾可以防止允許這樣的操作發生:
rational a,b;
radional c;
(a*b) = c;
一般用const修飾返回值為物件本身(非引用和指標)的情況多用於二目操作符過載函式並產生新物件的時候。
類中的成員函式:a fun4()const; 其意義上是不能修改所在類的的任何變數。
三、類中定義常量(const的特殊用法)
在類中實現常量的定義大致有這麼幾種方式實現:
1.使用列舉型別
class test
; // 列舉常量
int array1[size1];
int array2[size2];
};2.使用const
不能在類宣告中初始化const資料成員。以下用法是錯誤的,因為類的物件未被建立時,編譯器不知道size的值是什麼。
class test
;正確的使用const實現方法為:const資料成員的初始化只能在類建構函式的初始化表中進行。
注意:對const成員變數的初始化,不能在變數宣告的地方,必須在類的建構函式的初始化列表中完成,即使是在建構函式內部賦值也是不行的。
具體原因請參見 【初始化列表和賦值的區別】
3.使用static const
通過結合靜態變數來實現:
#include
class year
};int const year::inity=1997;//靜態變數的賦值方法,注意必須放在類外定義
void main()
{cout<要大膽的使用const,這將給你帶來無盡的益處,但前提是你必須搞清楚原委;
<2> 要避免最一般的賦值操作錯誤,如將const變數賦值,具體可見思考題;
<3> 在引數中使用const應該使用引用或指標,而不是一般的物件例項,原因同上;
<4> const在成員函式中的三種用法(引數、返回值、函式)要很好的使用;
<5>不要輕易的將函式的返回值型別定為const;
<6>除了過載操作符外一般不要將返回值型別定為對某個物件的const引用;
2樓:
你好,首先你應當明白引用時c++區別於c的一點。但是在lippleman的《深度探索c++的物件模型》中曾經指出,引用的實現說到底還是採用指標實現的,但是它比指標有自己的優勢。然後再lippleman的中他指出現代c++程式偏向於使用引用,而不是指標,但是並不是說指標不再使用。
c++中的const關鍵字是指出物件時乙個常量,是不允許變動它在記憶體當中的值的。但是還有很多點是需要注意的。
1.指向const物件的指標 const double *ptr表明ptr指向乙個double型別的物件,你可以賦值給ptr乙個常量或者不是常量。比如:
此時你不能通過ptr來更改temp的值,也就是說下面的語句是錯誤的:*ptr = 4.
0;但是temp本身並不是const變數,下面的語句就是對的:temp = 4.0; //注意const物件一定要在物件的初始化時賦值.
就是說下面的語句是錯誤的:
2.const指標 ,和一般的const物件一樣,說明指標本身是const,是不允許指向其他的物件的;比如下面的語句就是錯的:
注意const物件的初始化時一定需要賦值.
但是你可以使用ptr來更改temp的值,就是說下面的語句是對的:*ptr = 10.0;
對於你上面的例子中,首先你應該知道c++的識別符號的命名本身就應該包含足夠的資訊,而不是隨便的a,b,等沒有用的名字。函式print()就是說該函式是用來列印的,並不會更改物件的內容,所以你將函式的形參設為const,是為了當你在函式的實現中一不小心更改了物件的內容,編譯器會及時的報錯,從而能避免以後不需要的麻煩。
在標準的c中,函式形參的const說明是會被編譯器直接忽略的就是說你寫成const,但是你還是可以在函式的實現中更改物件的內容,但是你的const說明符告訴函式的使用者該專遞給函式乙個const物件,但是編譯器並不負責對你的更改操作給出error提示的.在c++中,確實會給出提示的。
所以當你的函式並不會改變物件的內容時,將其定義為const物件回事很好的程式設計習慣的。
cconst問題,C 中的const的用法
這樣解釋一下 int cc 5 int dd cc int ee cc int const aa dd aa 是 常指標,不允許 再指向別處,定義時初始化為 dd 的引用因為aa是常指標 所以 aa ee 會報錯 aa 1 允許 int cc 5 int dd cc int ee cc const ...
在C 中,使用const關鍵字而不是define語句的好處有哪些
define與const的概念 巨集不僅可以用來代替常數值,還可以用來代替表示式,甚至是 段。巨集的功能很強大,但也容易出錯,所以其利弊大小頗有爭議。用巨集來代表常數,好處是 1.讓 更簡潔明瞭 當然這有賴於你為巨集取乙個適當的名字。一般來說,巨集的名字更要注重有明確直觀的意義,有時寧可讓它長點。2...
在C 中,函式名前的const和函式名後的const有區別嗎
有區別。首先要知道函式名後面加const只能用於成員函式。int const func 合法,相當於const int func int func2 const 非法,對函式的const限定詞只能用於成員函式 在成員函式中,const加在函式名前和後也是有區別的。例如 class a int con...