“深入解析”這一詞只是為了吸引大家的眼球,這里我主要說說自己的理解。既然是深入解析,那也要有一定的見解才好,不然貽笑大方。
Const顧名思義,就是常量,常量是什么,那就是不能輕易改變,注意是輕易(用const_cast可以強制轉化)。我們主要從這幾個方面入手解析:#define和const、const指針類型和普通數據類型、普通const函數、類的const成員函數和成員變量。
一、#define。宏是對復雜內容替換以后的簡單文本,為了簡單易讀。typedef常用來定義一個標識符及關鍵字的別名,就是一個類型的同義。如:#define PI 3.1415926,typedef int A,A就和int是同義詞。當然這不是重點,大家都知道(我的毛病就是喜歡把所有關聯的知識點放到一起,因為記憶英語單詞我也是這么干的)。我們更關心的是#define和const的區別:
c++中const的用法。
#define M 12.56
const double cd = 12.54;
int main()
{double md = M;double dcd = cd;double md1 = M;double dcd1 = cd;return 0;
}
const一開始就分配了內存,而#define沒有。?const定義常量從匯編的角度來看,只是給出了對應的內存地址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而 #define定義的常量在內存中有若干個拷貝。const int ci = 2;//定義初始化ci = 3; //error:ci是const,不能變const double* pd = &dcd; // 和double const* pd = &dcd;一樣pd = &md;*pd = M; //Error:指針指向內容const不能變double* const p = &dcd;*p = M;p = &cd; //Error:指針是constconst double* const pcc = &dcd; //指針和內容都是constpcc = &cd;*pcc = M;
三、普通const函數
void function(const int Var);
b.參數指針所指內容為常量不可變void function(const char* Var);
c.參數指針本身為常量不可變(也無意義,因為char* Var也是形參)void function(char* const Var);
d.參數為引用,為了增加效率同時防止修改。修飾引用參數時:void function(const Class& Var); //引用參數在函數內不可以改變
void function(const TYPE& Var); //引用參數在函數內為常量不可變
不建議const作為函數返回值
class test {
public:test(int _a) :a(_a), b(0.12),c(0)/*必須初始化*/{pb = new int[10];}//const成員函數,把const放在函數聲明的末尾就可以了,表示該函數無法改變類的數據成員//只能發生讀操作,不能發生寫操作void init_variable()const{//a = 5;//不可以改變數據成員的值std::cout << a << std::endl;pb[0] = 10;//不能修改指針,但修改指針指向的內容是可以的。std::cout << pb[0] << std::endl;c++; //mutable}void init_variable(){//a = 5;//不可以改變數據成員的值//b = 3.2;//const數據成員變量不能改變std::cout << a << std::endl;std::cout << pb[0] << std::endl;}~test() {delete pb;pb = NULL;}
private:int a;int* pb;const double b;mutable int c;//關鍵字mutable使得c在const成員函數中也可以改變。
};
int main()
{const test mytest(4);mytest.init_variable();//可以調用const成員函數test test1(6);test1.init_variable();return 0;
}
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态