關於C/C++中const的用法,我們之前也介紹過很多,大家可以看看這兩篇文章,《C++基礎 詳細介紹const的用法》和《C++初學者 const使用詳解》,供參考。
今天在學習到《Essential C++》第4.1節時又有了“稍進一步”的發現,即當const來修飾一個類的成員函數時,它並不僅僅是禁止修改類裡面的數據,而且要求其裡面用到的類的成員都是具有const屬性的。如下以為示例:
- // CONST.CPP
- #include <iostream>
- using namespace std;
- class MyClass
- {
- public:
- MyClass();
- int getValueA();
- int getValueB()const;
- private:
- int a;
- int b;
- };
- MyClass::MyClass()
- {
- a = 1;
- b = 2;
- }
- inline int MyClass::getValueA()
- {
- return a;
- }
- inline int MyClass::getValueB()const
- {
- cout <<"value a: " <<getValueA();
- return b;
- }
- int main()
- {
- MyClass myclass;
- cout <<endl;
- cout <<"value a: " <<myclass.getValueB();
- return 0;
- }
在上面的代碼中,MyClass中以const修飾的成員函數getValueB()中調用了非const成員函數getValueA(),這段代碼在編譯是會提示有誤:
IDE: VS 2008
- const.cpp
- D:/Program Files/Microsoft Visual Studio 9.0/VC/include/xlocale(342) : warning C
- 4530: 使用了 C++ 異常處理程序,但未啟用展開語義。請指定 /EHsc
- const.cpp(29) : error C2662: “MyClass::getValueA”: 不能將“this”指針從“const
- MyClass”轉換為“MyClass &”
- 轉換丟失限定符
IDE: CODEBLOCKS
- F:/Programs/CodeBlocks/C++/Const/const.cpp||In member function 'int MyClass::getValueB() const':|
- F:/Programs/CodeBlocks/C++/Const/const.cpp|29|error:
- passing 'const MyClass' as 'this' argument of 'int MyClass::getValueA()' discards qualifiers|
- ||=== Build finished: 1 errors, 0 warnings ===|
如上錯誤可以在將getValueA()添加const修飾後得到更正。
附:
自己說的這些可能早就已經在某些書上指出,不過自己沒有碰到,既然剛剛學到,就記下來以備忘。另外下面再總結下const的其他點點。
1. const修飾常量、引用等時
“只讀”屬性。
2. 限定符const與指針時
有兩種用法,一為指向const對象的指針,二為const指針。
3. const可以提高編譯效率
編譯器在編譯期間通常不為const常量分配內存空間,而是把它保存在符號表這個名詞在《程序員的自我修養》裡有很清楚的解釋,空時再看)。少了存儲與讀內存的操作。
注意:
1、在使用指向const對象指針A的時候,雖然不能夠通過這個指針去修改其所指向的對象,但是並不表示每個被這種指針所指向的對象就一定受到良好的“保護”,因為這個對象本身就有可能已經被“偷梁換柱”。原因在於“非const對象的地址是允許賦給const對象的指針的”。
2、const限定符既可以放在類型前也可以放在類型後,在運用typedef寫const類型定義時容易犯錯。所以較好的寫法為把const放在類型的後面。
現在想想這是順其自然的事,因為只有在保證const成員函數裡面調用的成員函數不修改對象的情況下,才能夠保證這個const成員函數也不改變對象。所以被調用的成員函數被聲明為const是很保險的做法。