老生常談const

本文摘自: 智趣網-C語言/C++語言編程技術交流論壇(http://www.bczh.net) 詳細出處請參考:http://www.bczh.net/thread-1127-1-1.html
C/C++中有關const的用法在網上不少,而且這一知識點也是不少企業招聘時的常考題目。以前看到過相似的總結,不過由於本身很懶不經常使用因此也忘得差很少了,僅僅記得const是讓其修飾的對象僅擁有「只讀」的權限。不過今天在學習到《Essential C++》第4.1節時又有了「稍進一步」的發現,即當const來修飾一個類的成員函數時,它並不單單是禁止修改類裏面的數據,並且要求其裏面用到的成員都是具備const屬性的。以下覺得示例:
1.// CONST.CPP
2.#include <iostream>
3.
4.using namespace std;
5.
6.class MyClass
7.{
8.    public:
9.        MyClass();
10.        int getValueA();
11.        int getValueB()const;
12.    private:
13.        int a;
14.        int b;
15.};
16.
17.MyClass::MyClass()
18.{
19.    a = 1;
20.    b = 2;
21.}
22.inline int MyClass::getValueA()
23.{
24.    return a;
25.}
26.
27.inline int MyClass::getValueB()const
28.{
29.    cout <<"value a: " <<getValueA();
30.    return b;
31.}
32.int main()
33.{
34.    MyClass myclass;
35.
36.
37.    cout <<endl;
38.    cout <<"value a: " <<myclass.getValueB();
39.
40.    return 0;
41.}html

在上面的代碼中,MyClass中以const修飾的成員函數getValueB()中調用了非const成員函數getValueA(),這段代碼在編譯是會提示有誤:
IDE: VS2008
1.const.cpp
2.D:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(342) : warning C
3.4530: 使用了 C++ 異常處理程序,但未啓用展開語義。請指定 /EHsc
4.const.cpp(29) : error C2662: 「MyClass::getValueA」: 不能將「this」指針從「const
5.MyClass」轉換爲「MyClass &」
6.        轉換丟失限定符ios

IDE: CODEBLOCKS
1.F:\Programs\CodeBlocks\C++\Const\const.cpp||In member function 'int MyClass::getValueB() const':|
2.F:\Programs\CodeBlocks\C++\Const\const.cpp|29|error: passing 'const MyClass' as 'this' argument of 'int MyClass::getValueA()' discards qualifiers|
3.||=== Build finished: 1 errors, 0 warnings ===|程序員


如上錯誤能夠在將getValueA()添加const修飾後獲得更正。編程

附:
本身說的這些可能早就已經在某些書上指出,不過本身沒有碰到,既然剛剛學到,就記下來以備忘。另外下面再總結下const的其餘點點。
1. const修飾常量、引用等時
   「只讀」屬性。
2. 限定符const與指針時
   有兩種用法,一爲指向const對象的指針,二爲const指針。
3. const能夠提升編譯效率
   編譯器在編譯期間一般不爲const常量分配內存空間,而是把它保存在符號表(這個名詞在《程序員的自我修養》裏有很清楚的解釋,空時再看)。少了存儲與讀內存的操做。函數

兩點trick:
   ---在使用指向const對象指針A的時候,雖然不可以經過這個指針去修改其所指向的對象,可是並不表示每一個被這種指針所指向的對象就必定受到良好的「保護」,由於這個對象自己就有可能已經被「偷樑換柱」。緣由在於「非const對象的地址是容許賦給const對象的指針的」。
  ---const限定符既能夠放在類型前也能夠放在類型後,在運用typedef寫const類型定義時容易犯錯。因此較好的寫法爲把const放在類型的後面。學習

本文摘自: 智趣網-C語言/C++語言編程技術交流論壇(http://www.bczh.net) 詳細出處請參考:http://www.bczh.net/thread-1127-1-1.htmlui

相關文章
相關標籤/搜索