引用自:
雖然看過c++方面不少的資料,但我現在仍然是乙個初學者,編過c++的一些程式,但不多。const修飾詞做為c++乙個重要的概念,務必要弄清楚才行,看到網上乙個c++學習者的部落格上歸納的很不錯,很精煉。以下是參考的鏈結:
html
const是c++的關鍵字之一,與其他的關鍵字相比,c++初學者可能對於const的使用會一時摸不著頭腦,若能正確的使用const,將使你的程式更加robust!
先看下面的一些**:
inti =5
;const
int*
ip =&i;
intconst
*ip =&
i;int
*const
ip =&i;
const
int*
const
ip =
&i;
對於上面四個條語句,你能說出它們之間的區別嗎?
2)和3)中const修飾的是*ip,
這表明ip所指向的變數i是const的,類似*ip =
1的操作編譯的時候都會報錯;4)const修飾的是ip,說明指標本身是const,修改指標指向的變數是合法的,而類似++ip修改指標本身的操作是
違法的;5)指標本身和指向的變數都是const的。
const的用法主要體現在函式宣告中的應用,它既可以修飾函式引數,還可以修飾函式的返回值,此外對於類的成員函式,它還可以修飾整個函式。下面是乙個簡單簡單的二維向量類:
1class
vector2d
6vector2d(
const
vector2d
&vec ) : x( vec.x ), y( vec.y )
//修飾引數
7{}8
float
getx()
const
//修飾整個函式
9const
vector2d
operator+(
const
vector2d
&rval )
const
//修飾引數,返回值和整個函式
1011};
12--const修飾函式引數
在copy建構函式中,const修飾的
是函式的引數,呼叫函式的時候,用相應的變數初始化const常量,則在函式體中,按照const所修飾的部分進行常量化,如形參為const
vector2d &vec,則不能對傳遞進來的引用物件的進行改變,從而保護了原物件的屬性。
[tips]const通常用於修飾指標或引用型別的引數。
--const修飾返回值
在過載的向量加法運算子的函式中,返回值用const修飾,這樣如下的賦值操作就非法的:
vector2d vec1, vec2, vec3;
(vec1+vec2) = vec3;
[tips]一
般情況下,函式的返回值為某個物件時,如果將其宣告為const時,多用於運算子的過載。通常,函式返回值為某個物件或物件的引用時,不用const來修
飾。因為,這樣返回的例項只能訪問public成員和const成員函式,並且賦值操作也是非法的,這樣的用法是非常罕見的。
--const修飾類的成員函式
對於vector2d::getx()函式,因為它不會修改成員資料,若宣告成const,如果函式實現中修改了成員變數,編譯的時候將報錯,這樣程式會更加的robust。
[tips]
a.在你搞清楚const的用法之後,請大膽使用;
b.在引數中使用const應該使用引用或指標,而不是一般的物件例項;
c.不要輕易的將函式的返回值型別定為const;
d.除了過載操作符外一般不要將返回值型別定為對某個物件的const引用。
看完了這篇文章,很受感觸,寫的很好,作者肯定是在平時學習與工作中不斷的積累才把這些經驗總
結寫下來的,才給予我們這些初學者一些借鑑與經驗,讓我們少走彎路。當然,這些還只是相對來說形式比較簡單的情形,在複雜的情況下,我們更是要保持清醒的
大腦,寫程式就是這樣,一定要讓自己的大腦清醒,思路流暢,這樣才會少出錯誤。
c++學習中,希望每天都有進步!
C 之const用法解惑
首先,說下最基本的const用途 case1 const修飾變數,表示是常量,程式中不能更改,存放在常量儲存區。例如 const int a 100 case2 const修飾函式形參,表示傳入的引數在函式內部不能修改。例如 class test case3 非靜態成員函式後置const,表示成員函...
Const與Const的用法
const 是c 中常用的型別修飾符,常型別是指使用型別修飾符const說明的型別,常 型別的變數或物件的值是不能被更新的。const的作用 1 可以定義常量 即const int a 5 a就是乙個被const修飾的常量,它在程式執行期間是無法被改變的!2 保護被修飾的東西 例如乙個函式的首部為v...
const的常見用法
const用法主要是防止定義的物件再次被修改,定義物件變數時要初始化變數 下面我就介紹一下幾種常見的用法 1.用於定義常量變數,這樣這個變數在後面就不可以再被修改 const int val 10 val 20 錯誤,不可被修改 2.保護傳參時引數不被修改,如果使用引用傳遞引數或按位址傳遞引數給乙個...