C++幾個重要關鍵字(包含借鑑其他博主的東西)
//記憶體 棧區 與 static區 ,C++為了相容C,#include 只是文字替換,導致一堆名稱空間之間的複雜問題,倍受人詬病
extern 關鍵字
1.基本含義:意如其名,告訴編譯器宣告的東西是外部的。
特殊用法 extern "C" + 函式,宣告這個函式翻譯優化的時候 函式名 不改變(c++因為多型等原因,會改變函式名)
2. 宣告變數用法:
(1) 1.c 中 char a[6]; 2.c 中 extern char a[];
(2) 1.c 中 char a[6];1.h中 extern char a[]; 2.c中 #include ''1.h" 即可訪問 a;(以標頭檔案宣告,來代替每次在其他檔案中宣告)
(3) 1.c 中 ;1.h中 extern char a[6]="123456"; ; 2.c中 #inlcude “1.h” 會報錯 (定義會覆蓋extern關鍵字,顯示重複定義)
3.宣告函式變數用法
最好參考2中(2) 用法,這樣後面 函式引數修改 後,編譯期間會報錯
//////////////////////////////////////////////////////////////////////////////////////////////////////
static 關鍵字
extern 表明該變數在別的地方已經定義過了,在這裡要使用那個變數.
1.基本含義:意如其名,表示靜態的變數,分配記憶體的時候, 儲存在靜態區,不儲存在棧上面.
static 類似於隱藏,宣告即需要定義,只有一個副本,只能在本身的編譯單元內使用
extern部分 2 中(3)方法若將extern 替換成 static ,則可以編譯通過,此時在2個編譯單元中 都有一份 副本(互不相干);但是會帶來很多問題,
因此 static 宣告與定義 一般放在 .c 檔案中
2. c語言中使用
修飾變數,函式 同 1 中說明
修飾 函式中變數,這個比較特殊,肯定是放在靜態區,生命週期是到程式結束!!
3. c++語言中使用,主要是類中
修飾成員變數,成員函式 屬於類所有,一個副本
/////////////////////////////////////////////////
const 關鍵字
1. const 自帶屬性 是 static 宣告即需要定義,只有一個副本,只能在本編譯單元內使用
2. extern const 屬性 是 extern
3. const int * const p ;
4. 給定一個 類 class A,可能存在使用const的地方,第一行編號為 1,2,3,4,5,6,第二行編號為11,22,33,44,55,66
A a1(類變數), 普通成員函式 , 普通類成員 , 普通成員 , 普通函式引數 , 普通返回引數
const A a1(類常變數);const 成員函式 ;const 類成員, const 成員, const函式引數 , const 返回引數
普通成員函式 表示,我將要修改呼叫該函式的物件的資料
const成員函式 表示, 不會修改呼叫該函式的物件的資料 (實在要修改,可以將某個成員變數設定為 mutable )
正確的訪問邏輯是:
const成員函式 可以訪問一切,普通成員函式不能訪問 const物件任何成員
const類物件 只能訪問 const成員函式,普通類物件 可以訪問一切
const成員,必須在初始化列表中初始化
作為一種良好的程式設計風格,在宣告一個成員函式時,若該成員函式並不對資料成員進行修改, 應儘可能將該成員函式宣告為const成員函式
5 const &: 把不變的給 可變 的是有問題的
///////////////////////////////////////
volatile : 防止編譯器優化,有點複雜