1.const與變量(基本數據類型變量)
在C++中,被const關鍵字修飾的變量,其值在程序運行時不可改變,我們稱之爲即常量。被const關鍵字修飾的變量和普通變量一樣,擁有他自己的儲存空間。
定義const變量的格式爲:
//const 數據類型 變量名 = 常量值;
const int i = 100;
或者交換const與數據類型的位置也是可以的:
int const i = 100;
需要注意的地方:
1.定義const變量的同時要對它進行初始化,即給它賦值,不可先定義空的const變量然後在後面的代碼中賦值
2.const變量的作用域和普通變量一致,即只在所在的代碼塊存活,離開所在代碼塊會被釋放
3.const變量作爲類的成員變量時,除定義時可對其初始化之外,還可在構造函數的初始化表達式中對其進行初始化,但不可以在構造函數體內初始化
2.const與指針
const指針具有const普通變量一樣的特性,例如運行時不可改變值,定義時必須初始化等等。但根據指針聲明時const關鍵字所在的位置不同,該指針的特點也不同,我們以 const與 “ * ” 符號的位置來區分。
1.在“*”前加const的常指針:
定義格式:
int a = 0;
const int* i = &a;
根據上文提到的,將const與int的位置交換也是可以的,這也是爲何我強調用 “*”與const的位置來區分不同的常指針的原因:
int const* i = &a;
在“*”號前加const關鍵字的指針意爲禁止通過指針間接修改變量的指針,即可以用其他變量的地址對指針賦值,但是不可通過指針修改它所指變量的值,例如:
int a = 10,b = 20;
const int* p = &a; //定義時用變量a的地址對其進行初始化
p = &b; //正確, 這種const指針可以指向不同的變量
b = 50; //正確,禁止通過這種const指針間接修改變量的值不代表變量不可修改
*p = 50; //錯誤,不可通過這種const指針間接改變其指向變量的值
cout << *p << endl; //正確,可以訪問間接變量的值但不可以修改
需要注意的是,這種指針可以先定義,後賦值,不像const普通變量一樣必須定義時賦值:
int a = 10;
const int* p;//定義時可以不賦值(初始化)
p = &a;//允許在定義後再進行賦值(初始化)
2.在“*”後加const:
這種方式定義的指針意爲恆指向某個變量的指針,即該指針指向的變量不可變,只能一直指向一個變量,定義格式:
int a = 10,b = 20;
int* const p = &a;//定義時必須對其初始化(賦值)
這種指針在初始化後便不可改變其指向的變量,但是可以通過該指針間接修改變量的值:
int a = 10,b = 20;
int* const p = &a;//定義時必須對其初始化(賦值)
p = &b;//錯誤,不可改變其指向的變量
*p = 50;//正確,可以通過該指針間接修改變量的值
3. 在“*”前後都加const
這種方式聲明的指針具有上面兩種聲明方式的特點,即既恆指向同一個變量,又不可通過該指針間接修改變量的值,例如:
int a = 10,b = 20;
const int* const p = &a;
*a = 50;//錯誤
p = &b;//錯誤
3.const成員函數
在C++的類中,可以通過const聲明常成員函數,常成員函數不可修改類中的成員變量,只可以讀取,定義格式如下成員函數fun():
class A{
public:
void fun() const{
cout << "A::fun()" << endl;
}
};
成員函數可以通過是否爲const函數來進行重載,例如:
class A{
public:
void fun() const{
cout << "A::fun() const" << endl;
}
void fun(){
cout << "A::fun()" << endl;
}
};
使用const進行重載的函數在調用時根據對象的不同調用不同的對象,以上面的類A爲例:對於一般的對象,調用fun()時會調用非const的函數,對於const 對象,調用fun()時會默認調用const的fun()函數,下面貼出完整代碼以供測試:
#include <iostream>
using namespace std;
class A{
public:
void fun() const{
cout << "A::fun() const" << endl;
}
void fun(){
cout << "A::fun()" << endl;
}
};
int main()
{
A a;
a.fun();
const A b;
b.fun();
return 0;
}
使用Dev C++運行該程序,輸出:
A::fun()
A::fun() const
如此便驗證了我上文所說的調用規則。
對於const成員函數還需注意以下幾點:
1.常成員函數在聲明和定義時都要加上const關鍵字,否則編譯報錯:
class A{
public:
void fun() const;
};
void A::fun() const{
cout << "A::fun() const" << endl;
}
2.常成員函數中只能調用常成員函數,不可以調用非const成員函數,因爲非const成員函數可能修改成員變量的值 ,其次,const對象只能調用const成員函數
本文到此結束。
參考資料:
王慧 王浩等編著.《零基礎學C++》.第三版.機械工業出版社
王珊珊 臧洌 張志航等編著.《C++程序設計教程》.第三版.機械工業出版社