const關鍵字的使用
定義const變量
通常使用const來定義常量,在變量的前面加上const關鍵字即可如下:
const int a; int const a; //表示a的值是一個常量,不可以通過賦值的方式來修改
在C++中const被當成編譯期的常量來處理,也就是說,編譯器不為const常量分配空間,只在編譯時將它的值保存在名字列表中,當我們通過內存地址間接修改常量的值時,其結果保持不變。代碼如下:
#include<stdio.h> int main() { const int a=1; int *p=(int*)&a; *p=100; printf("a=%d\n",a); return 0; }
其運行結果如下:a=1;
在類與對象中的應用:
在C++中const在類與對象中的應用主要有以下幾個場合:
(1):常量數據成員的應用
(2):函數的參數為常量的應用
(3):常量函數的應用
(4):常量對象的應用
常量數據成員的應用
若類中的某個數據成員是常量,表示這個數據成員不能直接被修改,故const數據成員要求初始化,在類中數據成員是不允許在定義時初始化的,類僅僅是一種數據類型,類中的數據成員和成員函數的使用都是通過實例的對象調用,也就是說,有了對象類中的數據成員和函數成員才有了生命,因此const數據成員的初始化應該在對象產生的時刻,即應該在構造函數中初始化,並且const數據成員是在構造函數的初始化表中進行的。程序如下:
class A { private: int a; const int b; //const常量 public: A(int a, int b):a(a),b(b){} //const數據成員初始化 void show() { cout<<a<<","<<b<<endl; } };
註:const數據成員是必須在構造函數的初始化表中進行!!!!
函數參數為常量的應用方法
類中的函數成員的參數通常使用引用,表示用源頭的數據,不會再自己復制一份。當希望傳遞給函數成員的數據不被破壞,就需要定義成const變量
#include<iostream> using namespace std; class A { private: int a; const int b; public: A(int a, int b):a(a),b(b){} void show() { cout<<"a="<<a<<","<<"b="<<b<<endl; } void set(const int &x) //通過引用直接訪問x,並且保證x的值不會被篡改 { a=x; } }; int main() { int x=99; A a(1,2); a.show(); a.set(x); a.show(); return 0; }
運行結果:
a=1,b=2 a=99,b=2
常量成員函數與常量對象的使用方法
在C++中,常量函數必須定義在類中,以成員函數的形式出現,常量成員函數的好處就是保證類的封裝性,能夠有效的防止類的數據成員被非法訪問。
常量函數的定義:
int fun(void) const;
註意:const int fun(void);表示的是該函數的返回值為常量,不可與常量函數混淆!!
上面的常量函數 int fun(void) const 實際上與int fun(void)構成重載關系,重載函數是通過函數的參數或個數不同來構成重載的,int fun(void) const 與int fun(void)構成重載關系是因為this指針,普通函數的this指針是普通指針,而const成員函數是常量指針。
對象調用常量函數規則有以下幾個(歸根到底就是this指針是常量指針):
1、非常量對象可以調用常量函數
2、非常量對象可以調用非常量函數
3、常量對象可以調用常量函數
4、常量對象不可以調用非常量函數
5、常量函數和非常量函數重載時,非常量對象調用非常量函數
6、常量函數和非常量函數重載時,常量對象調用常量函數
總結:歸根到底常量函數還是屬於對象的(和static要區分開),故可以被任何對象調用;
常量對象由於this指針是常量指針,故不可以調用非常量函數(常量函數可以接受非常量,但不可以把常量賦給非常量);
突破常量成員函數修改數據成員的限制
將this常量指針轉換為非常量指針
將this常量指針的const屬性去掉,可以使用const_cast(去const)運算符完成
將數據成員定義為mutable屬性
將數據成員定義為:mutable int a;就可以間接實現常量函數修改成員數據。
const關鍵字的使用