国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

庖丁解牛<c++primer>系列二:const關鍵字

2019-11-08 18:48:57
字體:
來源:轉載
供稿:網友

轉載請注明出處 -const關鍵字的定義: 如果我們定義一個變量,但是在以后的維護中不想改變里面的值,就可以用const關鍵字對變量的類型進行鎖定。正由于一旦賦值后就不能對其進行改變,所以const必須初始化。

-初始化時候注意事項: 由于const必須定義的時候必須初始化,而且const關鍵字僅在文件內有效。因為擔心重復定義問題,所以僅在文件內有效,而在其它文件中通過聲明來使用它。

如果想在多個文件中共享const對象,必須通過添加關鍵字extern來實現的。

//file_1.cpp 定義并初始化了一個常量,該常量能被其它文件訪問extern const int bufSize = fcn();//file_1.h頭文件extern const int bufSize; //與file_1.cpp中定義的bufSize是同一個

refernce to const(對常量的引用):把引用綁定到const對象上面,但是和普通引用的區別是,對常量的引用不能被用作修改它所綁定的對象。因此對const的引用可以簡稱常量引用。

const int ci=1024;const int &r1=ci; //正確,引用及其對應的對象都是常量r1=42; //錯誤,r1是對應常量的引用int &r2=ci; //錯誤,讓一個非常量引用指向常量的對象,正確的處理方法就是前面加constint i=42;const int &r3=i; //正確,允許將const int &綁定到一個普通的int對象上

臨時量對象:簡稱臨時量,指當編譯器需要一個空間來暫時存儲表達式的求值結果時臨時創建一個未命名對象。

double a=3.14;const int &i=a; //const int &i=a 是由 const int temp=a; const int &i=temp 這兩步構成的int i=42;int &r1=i; //引用(改名)r1綁定對象iconst int &r2=i; //r2也綁定i,但是不允許通過r2改變i的值r1=0; //r1不是常量,因此i值是0r2=0; //錯誤,r2是一個常量,不能改變

指針和const 指向常量的指針(pointer to const):要想存放常量對象的地址,只能使用指向常量的指針,但是不能用于改變其所指對象的值。

const double pi=3.14; //pi是一個常量,值不能改變const double *c=π //c指向一個雙精度常量double *p=π //錯誤,p是一個普通指針,不能指向一個常量*c=42; //錯誤,常量不能賦值double dval=3.14;c=&dval; //允許一個指向常量的指針指向非常量對象

常量指針(const pointer):必須初始化,而且一旦初始化完成,它的值就不能改變了。

int a=0;int *const b=&a; //b一直指向a,不能改變const double pi=3.14;const double *const ppi=π //ppi是一個指向常量的常量指針,有點繞口吧ヽ(??▽?)ノ

頂層const(top-level const)和底層const(lou-level const):由于指針本身是一個對象,它又可以指向另外一個對象,因此我們把指針本身的常量用頂層const表示,我們把指向對象的常量用底層const表示。

int a=0;int *const b1=&a; //不改變b1的值,頂層constconst int c=42; //不改變c的值,頂層constconst int *b2=&c; //改變b2的值,低層constconst int *const b3=b2; //右邊是頂層const,左邊是低層constconst int &r=c; //聲明引用都是低層constint *b=b3; //錯誤,由于b3是底層constb2=b3; //正確,b2和b3都是底層constb2=&i; //這是本節的難點,大家記住這個正確的原因是非常量可以轉化為常量,但是反之不成立int &r=c; //普通int&不能綁定到int上const int &r2=i; //const int&可以綁定到int上

部分童鞋對上面代碼感覺困惑原因是對底層const執行拷貝操作時候,拷貝和被拷貝的對象必須具有相同的底層const,或者兩者具有可以互相轉換的數據類型。

和常量表達式 常量表達式(const exPRession)指值不會改變并且在編譯過程中就能得到計算結果的表達式。一個對象或者表達式是不是常量表達式由它的數據類型和初始值共同決定的。

const int max_files=20; //max_files是常量表達式const int limit=max_files+1; //limit是常量表達式int staff_size=27; //因為staff_size類型不是const int所以不是常量表達式const int sz=get+size(); //雖然sz是常量,但是它的值等到運行時候才能夠獲取,也不是常量表達式

constexpr變量 “C++11”新標準規定,聲明為constexpr的變量一定是一個常量,而且必須用常量表達式初始化。所以如果在編寫代碼時候你認定某個變量是一個常量表達式,那最好就把它聲明為一個constexpr類型。

constexpr int mf=20; //20是一個常量表達式constexpr int limit=mf+1; //mf+1是一個常量表達式constexpr int sz=size(); //只有當size函數是一個constexpr函數時,才是一條正確的聲明語句,否則都不是正確的聲明

字面值類型(literal type):聲明constexpr時用到的類型成為字面值類型,經常接觸的字面值類型有算術類型、引用和指針等。 注意: 1、函數體內定義的變量不能用來初始化constexpr,函數體外的對象可以用來初始化conseexpr指針。 2、在constexpr聲明中如果定義了一個指針,限定符constexpr僅對指針有效,與指針所指的對象無關。

const int *p=nullptr; //p是一個指向"整形常量"的指針constexpr int *q=nullpter; //q是一個“常量指針”
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 三台县| 攀枝花市| 克东县| 陆丰市| 玛纳斯县| 招远市| 黄冈市| 南华县| 涪陵区| 南丹县| 伊通| 清流县| 睢宁县| 固始县| 石城县| 颍上县| 襄汾县| 儋州市| 建水县| 凌源市| 应城市| 威宁| 海淀区| 巨鹿县| 浦城县| 砚山县| 德阳市| 大方县| 重庆市| 安龙县| 龙海市| 长春市| 岳池县| 建瓯市| 北海市| 二连浩特市| 焉耆| 会理县| 三河市| 红桥区| 栾城县|