既然類的例項是個物件,那麼它也應該可以被
const
修飾。按照
const
的定義,
const sampleclass foo_const; 與
sampleclass foo;
並不是同樣的東西。簡單來說,
foo_const
不能被改變,顯然也就是它的字段不能被改變。那麼普通的物件
foo能做的事情
foo_const
是不是也能做呢。
例如,我們的類是這樣的
class sampleclass
}顯然,
foo.changevalue()
完全沒有問題,可是
foo_const.changevalue()
cannot convert 『this』 pointer from 『const class sampleclass』 to 『class sampleclass &』
如果乙個成員函式沒有把傳遞給它的
this
指標指定為
const
,編譯器就不允許
const
物件呼叫它。
那麼是不是
const
物件就不能呼叫成員函式呢?肯定不是,成員函式中也可以不改變成員的值呀。比如:
int getvalue()
這個函式沒有改變任何東西,但是編譯器不知道啊,所以它還是不允許可憐的
foo_const
呼叫。所以我們需要給編譯器乙個明確的標識。
int getvalue() const
在函式的括號後面加上
const
,表示這個函式不會改變類的資料成員。
const
物件因此也就可以放心大膽的呼叫它了。如果誰不小心在
const
成員函式的函式體裡面把資料成員寫在了等號的左邊,沒有關係,編譯器一定會報告乙個
error。
值得注意的是,
int getvalue() const
與int getvalue()
完全是兩個函式,
const
也是函式型別的一部分,如果要在類的外面定義
int getvalue() const
,寫成inline int getvalue()
編譯器會報錯。那麼,如果兩個都寫上,豈不是也算是一種過載?正確,萬一哪天有人出題說要盡量多的過載,
const
也是乙個利器啊
^_^總之,對於乙個類來說只要是不改變自己的資料成員的函式咱們都應該給它加上
const
,使它成為
const
函式。
在成員函式中我們還經常看見
const
出現在返回值的前面。這真是詭異,我們明白這是告訴編譯器這個函式的返回值不允許改變,可是誰會傻到寫這樣的**呢?
foo.getvalue()=20;
可是總有人會寫出這種句子來,
(a=b)=c;
這不就是
a.operator = (b)=c
麼,所以
const
修飾返回值也不是不應該。
當然還有一種討厭的情況,萬一我想在
const
函式裡面修改資料成員的值應該怎麼辦。
辦法不是沒有,比如說
const_cast
可以用蠻力去掉
const
,不過這個方法顯然不被推薦。
另乙個方法是在資料成員宣告的時候就說清楚,這個成員一定是可變的,不存在什麼常量的情況。
class sampleclass
即使宣告
const sampleclass foo_const;,
我們也一樣可以改變
flag
的值。
const物件與const成員函式
const物件只能呼叫const成員函式 includeusing namespace std class a public void fun const cout const 成員函式 但是如果把第以1個fun注釋掉就會出錯 error c2662 a fun 不能將 this 指標從 const...
類成員函式後帶const
www.libcl.cn 這篇文章主要記錄我對 類成員函式後帶const 的理解。例子 class consttemp void seta int na void printa const 為什麼在成員函式printa 後面加多乙個const?這是把整個函式修飾為const,即 函式體內不能對成員資...
const修飾類的成員函式
effective c 裡面說,盡量使用const,const修飾變數一般有兩種方式 const t a,或者 t const a,這兩者都是一樣的,主要看const位於的左邊還是右邊,這裡不再贅述,主要來看一下當const修飾類的成員函式時,成員函式有什麼特點。類的成員函式後面加 const,表明...