庖丁解牛系列二 const關鍵字

2021-07-27 21:34:39 字數 3593 閱讀 6011

-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; //錯誤,讓乙個非常量引用指向常量的物件,正確的處理方法就是前面加const

int 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繫結物件i

const

int &r2=i; //r2也繫結i,但是不允許通過r2改變i的值

r1=0; //r1不是常量,因此i值是0

r2=0; //錯誤,r2是乙個常量,不能改變

指標和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的值,頂層const

const

int c=42; //不改變c的值,頂層const

const

int *b2=&c; //改變b2的值,低層const

const

int *const b3=b2; //右邊是頂層const,左邊是低層const

const

int &r=c; //宣告引用都是低層const

int *b=b3; //錯誤,由於b3是底層const

b2=b3; //正確,b2和b3都是底層const

b2=&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是乙個「常量指標」

測試庖丁解牛分詞工具

因為筆者要在mapreduce中進行中文分詞解析資料,所以測試了一下庖丁解牛中文分詞器 paoding analysis 2.0.4 beta 現將使用過程小結 個人環境 linux eclipse 使用分為如下幾步 1.配置dic檔案 修改paoding analysis.jar中的paoding...

Blue Coat 庖丁解牛 雲安全勢在必行

本文講的是blue coat 庖丁解牛 雲安全勢在必行,移動網際網路與雲服務的熱潮讓如今的企業辦公環境發生了根本性的改變。業務系統和遠端服務都在通過雲端慢慢向移動終端遷移,基於雲的多樣化手段也催生了基於雲的全新的安全概念。受訪人blue coat大中華區技術總監 王躍霖 blue coat此前收購p...

庖丁解牛Linux核心分析 0x00 《庖丁解牛》

庖丁解牛 吾生也有涯,而知也無涯 以有涯隨無涯,殆已!已而為知者,殆而已矣!為善無近名,為惡無近刑。緣督以為經,可以保身,可以全生,可以養親,可以盡年。庖丁為文惠君解牛,手之所觸,肩之所倚,足之所履,膝之所踦,砉然嚮然,奏刀騞然,莫不中音。合於 桑林 之舞,乃中 經首 之會。文惠君曰 嘻,善哉!技蓋...