c++中const的用法,C++ Const深入解析

 2023-11-12 阅读 15 评论 0

摘要:“深入解析”這一詞只是為了吸引大家的眼球,這里我主要說說自己的理解。既然是深入解析,那也要有一定的見解才好,不然貽笑大方。 Const顧名思義,就是常量,常量是什么,那就是不能輕易改變,注意是輕易(用const_cast可以

“深入解析”這一詞只是為了吸引大家的眼球,這里我主要說說自己的理解。既然是深入解析,那也要有一定的見解才好,不然貽笑大方。

Const顧名思義,就是常量,常量是什么,那就是不能輕易改變,注意是輕易(用const_cast可以強制轉化)。我們主要從這幾個方面入手解析:#define和const、const指針類型和普通數據類型、普通const函數、類的const成員函數和成員變量。

一、#define。宏是對復雜內容替換以后的簡單文本,為了簡單易讀。typedef常用來定義一個標識符及關鍵字的別名,就是一個類型的同義。如:#define PI 3.1415926,typedef int A,A就和int是同義詞。當然這不是重點,大家都知道(我的毛病就是喜歡把所有關聯的知識點放到一起,因為記憶英語單詞我也是這么干的)。我們更關心的是#define和const的區別:

c++中const的用法。

  1. 編譯器處理方式不同。#define是在預處理階段展開(編譯),const常量是編譯運行階段使用。
  2. 類型和安全檢查不同。#define沒有類型,沒有類型檢查,只是簡單的展開,const有數據類型,在編譯運行階段檢查類型。
  3. 存儲方式不同。define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內存,const常量會在內存中分配(可以是堆中也可以是棧中)。
  4. 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定義的常量在內存中有若干個拷貝。
  5. 提高了效率。 編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。既然這么好,能使用const就使用const。
二、const+數據類型+變量。
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函數
a.傳遞過來的參數在函數內不可以改變(無意義,因為Var本身就是形參)
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;
}


五、static和const(static理解)
這個看這篇文檔就知道了const_static
?好了,寫到這里我也對const有了比較深的理解,不知道大家感覺如何。盡量用const。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/172473.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息