C++中的const應用的很靈活,const也大大改善程序的健壯性,下面就const在C++中的各種用法,做一個總結
const的使用地方
1.定義常量
(1)const修飾變量,以下兩種定義形式在本質上是一樣的。它的含義是:const修飾的類型爲TYPE的變量value是不可變的
TYPE const ValueName = value;
const TYPE ValueName = value;
在定義一個變量時用了const,就是常量了,在之後不能改變其值。
有的時候需要使用const變量,他的初始值不是一個常量表達式,但又確實有必要在文件中共享,這種情況下我們不希望編譯器爲每一個文件分別生成獨立的變量,相反的,我們希望這類const對象像其他(非常量)對象一樣工作,也就是說,只要在一個文件中定義了const,而在其他的文件中聲明並使用它。
解決的辦法是:對於const變量不管是申明還是定義都加extern關鍵字,定義一次就可以了
extern const int bufSize = fcn() //一個文件中
extern const int bufSize //和上面定義的bufSize是同一個
注意:默認狀態下,const對象僅在文件內有效
const對象在定義時必須初始化,因爲const對象在創建後就不能更改它的值
2、指針使用CONST
(1)指針本身是常量不可變
char* const p;
這個用const來修飾p,說明指針本身定爲常量,常量指針必須初始化,而且一旦初始化,則它的值(也就是存放在指針裏的地址)就不再改變的了
(2)指針所指向的內容是常量不可變
const char *p;
(3)兩者都不可變
const char* const p;
頂層const和底層const
頂層const表示指針本身是個常量
底層const表示指針所指的對象是一個常量
int i= 0
int *const p1 = &i //不能改變p1的值,是頂層const
const int ci = 42 //不能改變ci的值,是頂層const
const int *p2 = &ci //能改變p2的值,是底層const
(4)還有其中區別方法,沿着*號劃一條線:
如果const位於*的左側,則const就是用來修飾指針所指向的變量,即指針指向爲常量;
如果const位於*的右側,const就是修飾指針本身,即指針本身是常量。
3.const修飾函數系列
1)const修飾函數參數
傳遞過來的參數在函數內不可以改變,與上面修飾變量時的性質一樣
void testModifyConst(const int _x) {
_x=5; ///編譯出錯
}
2).const修飾成員函數
(1)const修飾的成員函數不能修改任何的成員變量(mutable修飾的變量除外)
(2)const成員函數不能調用非onst成員函數,因爲非const成員函數可以會修改成員變量
#include <iostream>
using namespace std;
class Point{
public :
Point(int _x):x(_x){}
void testConstFunction(int _x) const{
///錯誤,在const成員函數中,不能修改任何類成員變量
x=_x;
///錯誤,const成員函數不能調用非onst成員函數,因爲非const成員函數可以會修改成員變量
modify_x(_x);
}
void modify_x(int _x){
x=_x;
}
int x;
};
3).const修飾函數返回值
(1)指針傳遞
如果返回const data,non-const pointer,返回值也必須賦給const data,non-const pointer。因爲指針指向的數據是常量不能修改
const int * mallocA(){ ///const data,non-const pointer
int *a=new int(2);
return a;
}
int main()
{
const int *a = mallocA();
///int *b = mallocA(); ///編譯錯誤
return 0;
}