對於const關鍵字,我們習慣性的將它直接看作常量,但當你編譯下面**時,會發現與我們之前的理解有所偏差:
const int size;
int arr[size];
//.c 不能通過
//.cpp 順利執行
在定義陣列時,必須指定陣列元素個數為常量,但在c中卻不能通過,以此可以推翻const修飾的值是常量。參考《c語言深度剖析》,可以將const修飾的值看作readonly屬性,而c++之所以可以通過,是因為在c++中拓展了對const的含義。
下面針對const在不同編譯環境下做深入理解:
- c
修飾一般變數 —唯讀變數
修飾陣列—唯讀陣列
//定義同時必須初始化
//const 與 型別名可交換順序; const修飾的變數存放在 .rodata段,唯讀資料段
const int i = 10;
int const arrar[3] = ;
修飾函式引數—不可改變
修飾函式返回值—不可改變
void func(const char* s);
const char* func();
修飾指標—編譯器解析時忽略型別名,可以看作除型別名之外const修飾離其最近的
//下面我針對不同情況舉例分析:
const int *p; //const修飾*p,即p指向內容不可變
int const *p; //const修飾*p
int *const p; //const修飾p,即p本身不可變
const int *const p;//前乙個const修飾*p, 後乙個const修飾p
注:
對於c中const修飾的值並不是真正安全的(即真正唯讀/不可改變),通過下面舉例分析便可以得到原因:
const int i = 10;
int *p = i;
//在c編譯其中預設支援用const int*型別去初始化int *型別
//諸如此類,那麼我們必然會考慮到通過指標p可以去改變i的值
*p += 10;
//此時,i的值便被改變了
1.唯讀:更安全的巨集替換
2.不可改變:實質上是指不可直接去改變。
- c++
對於c++來說,相比c對const擴充套件了不同含義。
擴充套件1、
常量:定義同時初始為立即數。
常變數:初始值為變數,則在編譯時期不確定。
int a = 10;
const int n = 10;//n為常量
const int m = a; //m為常變數
//預編譯階段直接進行簡單巨集替換,
int b = n; // int b = 5;
int c = m; // int c = a;(在編譯時期不確定)
擴充套件二、
任何試圖將乙個非const物件的指標指向const物件的動作,都將引起編譯錯誤。
const int *a = 10;
const int *p = a;
int const *q = a;
//此時p和q通過const修飾限定其指向內容不可改變,即保證了a的安全性。
//但p和q自身指向可以改變,不過也對a毫無影響了。
使用const的必要性:1.更安全的巨集替換,減少不必要的記憶體分配、儲存與讀取。
2.**可讀性與可維護性。
將特殊值或物件通過全域性唯讀變數代替,易於辨識和後期修改。
修飾一般變數
首先,對於static修飾的變數,均有以下特點:
1、 全域性靜態變數:在全域性變數前加上static,使該變數僅在當前檔案可用。
與普通全域性變數區別:限制了所修飾變數的作用域。
2、區域性靜態變數:在區域性變數前加上static,使該變數在當前函式體內恆有效,即僅首次呼叫該函式時對此變數進行初始化,並且直至程式執行結束才釋放此變數。
與普通區域性變數區別:拓展了所修飾變數的生命週期。
//下面通過**實際測試一下:
static int a;
static int b = 0;
//這種使用者直接將b初始化為0的操作與編譯器對a的處理是一樣的,因此也會將b放置在.bss段
void func()
//雙重判斷保證多執行緒安全
return pinstance ;
}private:
single (){}
static single *pinstance ;
};single *single::pinstance = null;
//此時通過物件指標檢視物件位址會發現均指向同一塊記憶體空間
深入理解Java Volatile關鍵字
1.volatile關鍵字的作用是什麼?a.當乙個變數被定義為volatile之後,它將具備兩種特性 一 保證此變數對所有執行緒的可見性 可見性的意思為 當某個執行緒對volatile變數的值進行了修改,其他的執行緒是可以立即得知的 而普通的變數是無法做到這一點的,執行緒先是對工作記憶體當中的普通變...
深入理解volatile關鍵字
併發的三大性質 併發分析的切入點分為兩個核心,三大性質 public class volatiledemo thread.start try catch interruptedexception e isover true volatile修飾的共享變數進行寫操作時,會多出lock字首的指令,實現快...
const關鍵字的深入理解
const作為c 語言的關鍵字,我們的設計原則是,盡量多使用const變數 那麼為什麼是這樣呢,c 語言引入指標的不足之處就是記憶體的管理變複雜,容易出現引用出錯,所以我們有時需要對不能夠更改的位址空間進行保護即只能讀,不能寫,這個保護的方式就是定義為const,由const修飾的記憶體空間不能夠寫...