深入理解關鍵字 const static

2021-08-30 02:10:52 字數 2699 閱讀 2691

對於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修飾的記憶體空間不能夠寫...