來自C 的 Const式 傲嬌

2022-07-01 03:27:14 字數 2772 閱讀 4522

好久之前就想要做乙個有關const的總結了.作為c++裡實用但複雜的限定符,const可謂是讓人又愛又恨.廢話不多說了,提前做個說明:這是乙個c++語言的const語法簡明介紹.講求快速參考,快速應用.如果想深入詳細地參考應用例項與講解的請自行參考primer第五版.

1、const物件必須初始化,且一旦初始化就沒有辦法改變.

2、對const物件進行初始化的可以是任意複雜的表示式.

3、預設const物件僅僅在其單個檔案內有效,因為編譯器會想define一般直接替換.如果希望在多個檔案內有效可以extern修飾.

//無論是定義還是宣告都要寫成統一的形式

//file_1

extern const int maxn=12;//但是初始化只能在其中乙個位置

//file_2

extern const int maxn;

1、允許為乙個常量引用繫結非常量的物件、字面值,甚至是一般表示式.

2、引用本身不是物件,const與引用打配合其實是說:該引用不能改變被引用物件.

3、引用的物件是常量還是非常量可以決定其所能參與的操作,卻無論如何都不會影響到引用和物件的繫結關係本身.

1、用於宣告引用的const都是底層const.引用並不是物件,所以就無所謂什麼引用本身是否能夠被修改.const修飾引用一定是限制引用使其不能修改被引用物件的值.至於被引用物件是否能夠通過其他途徑改變自身的值,就不得而知了.

int a=2;

const int &p=a;//不能通過p修改a的值

//int &s=42; 不能用字面值初始化乙個非常量引用

2、限制指標的const

之所以有頂層與底層的概念是因為:指標本身是不是常量指標所指向的物件是不是常量是兩個獨立的問題.

指標的頂層const:表示指標本身是個常量.

指標的底層const:表示指標所指的物件是乙個常量.

int i=0;

const int k=0;//不是指標,不能改變k,這是頂層const

const int* temp1=&i;//不能改變i,這是底層const =>常量(的)指標

int* const temp2=&i;//不能改變指標本身,這是頂層const =>指標(是)常量

3、物件拷貝過程中的const

int &s=42; //錯誤:不能用字面值初始化乙個非常量引用
int p;

const int *const p3=&p;//p3具有底層const資格(int前有const)

/*上面兩句中:非常量初始化了底層const物件,若反過來則不行*/

int* t=p3;//錯誤:p3具有底層const,而t沒有.

int i=0;

const int ci=i;

const int &pi=i//正確:const int&變數可以繫結到普通int上

int &r=ci;//錯誤:普通的int&不能繫結到const int變數上

1、編譯器會自動為成員函式傳參this指標.尾後const限制了這個this指標,使得函式只能訪問而不能修改類的成員變數.

2、無論乙個類的例項是否被const限制,它都可以呼叫這種帶有尾後const的類成員函式.但是const例項是不能夠呼叫尾後無const的成員函式的.

class time

; const time& gettime() const

;void show()const ;

void fun() ;

//無const限制的物件在呼叫fun()時會優先呼叫無尾後const限制的函式

//有const限制的物件只允許呼叫帶有尾後const限制的fun()函式

1、當用實參初始化形參時會忽略掉形參的頂層const.

void fcn(const int i) 

//呼叫fcn函式時,既可以傳參const int也可以傳參int

//void fcn(int i) 這種過載是不允許的,因為傳參時忽略了頂層const

2、形參的初始化方式同變數的初始化方式相同。

void reset(int*);

void reset(int&);

int i=0;

const int ci = i;

string::size_type ctr = 0;

//reset(&i);//正確:傳入i的位址

reset(&ci);//錯誤:const int*不可初始化int*

//reset(i);//傳入以引用作引數的函式

reset(ci);//錯誤:普通引用不能繫結對應的const物件

reset(42);//錯誤:普通引用不能繫結到字面值上

reset(str);//錯誤:型別不匹配

3、函式形參盡量定義成const型別的引用

傲嬌的js之源 Object

1.這個叫做物件字面量 var obj 2.new object 這個叫做new出來的物件 var obj2 new object 這兩種建立物件方式,從測試效果來看,會快一點,new關鍵字呼叫了建構函式而 不會。如果new object 中沒有傳入引數,與 是一樣的。3.一下new做了什麼?自定義...

傲嬌的十六進製制

問題描述 輸入乙個以回車結束的字串 少於80個字元 濾去所有的非十六進製制字元後,組成乙個新字串 十六進製制形式 輸出該字串並將其轉換為十進位制數後輸出。輸入形式 乙個字串,小於80個字串 輸出形式 輸出為兩行 第一行 為整理後的新串 第二行 乙個十進位制數字 樣例輸入 fg 樣例輸出 f incl...

傲嬌的python之python檔名

今天在學習pygame的時候,隨手新建了乙個pygame.py的檔案,想來試試pygame這個模組,如下 usr bin env python coding utf 8 date 2017 03 14 19 57 48 author lats jiabin.yang outlook.com link...