const與static的區別是什麼

2021-03-04 05:38:34 字數 5829 閱讀 7194

1樓:

const 是常量, 也就是唯讀的, 是乙個"右值"

比如 const int iret = 2 ;

iret = 3 ; // 這句是錯的, const型別只能在初始化的時候賦值, 之後不能改變

static稱為靜態變數, static有兩種, 一種是在類的成員變數中, 一種是區域性變數或全域性變數.

在類中的, 用**解釋

class exp ;

int main()

類中的static變數的意思是, 在這個類的所有例項中的值都是一樣的, 它與const不同, const 只是唯讀, 在其他方面與不帶const的變數沒什麼區別

還有一種是const全域性變數或區域性變數, 這兩種是相同的, 區域性變數的作用域會和全域性變數相同

上**:

static int i1 ;

int add(int a, int b)

void main()

還有幾點static的特點,(適用於static全域性變數或區域性變數)

1.static變數在全域性資料區分配記憶體, 也就是 在生成的可執行檔案中佔一定空間, 這點與全域性變數相同

2.static變數只在它所在的原始檔中可用. 如果乙個專案有很多 .

c或者.cpp檔案, static變數可以出現在每乙個檔案中, 而他們卻是不同的, static可以解決許多檔案中變數 名字相同的問題.

static const和const static的區別

2樓:司馬刀劍

對於c/c++語言來講,

const就是唯讀的意思,只在宣告中使用;

static一般有2個作用,規定作用域和儲存方式.對於區域性變數,static規定其為靜態儲存方式,每次呼叫的初始值為上一次呼叫的值,呼叫結束後儲存空間不釋放;

對於全域性變數,如果以檔案劃分作用域的話,此變數只在當前檔案可見;對於static函式也是在當前模組內函式可見.

static const 應該就是上面兩者的合集.

下面分別說明:

全域性:const,唯讀的全域性變數,其值不可修改.

static,規定此全域性變數只在當前模組(檔案)中可見.

static const,既是唯讀的,又是只在當前模組中可見的.

檔案:檔案指標可當作乙個變數來看,與上面所說類似.

函式:const,返回唯讀變數的函式.

static,規定此函式只在當前模組可見.

類:const,一般不修飾類,(在vc6.0中試了一下,修飾類沒啥作用)

static,c++中似乎沒有靜態類這個說法,一般還是拿類當特殊的變數來看.c#中有靜態類的詳細說明,且用法與普通類大不相同.

3樓:嶽愷歌象強

const是常量,也就是唯讀的,是乙個"右值"

比如constintiret=2;

iret=3;//這句是錯的,const型別只能在初始化的時候賦值,之後不能改變

static稱為靜態變數,static有兩種,一種是在類的成員變數中,一種是區域性變數或全域性變數.

在類中的,用**解釋

clas***p;

intmain()

類中的static變數的意思是,在這個類的所有例項中的值都是一樣的,它與const不同,const只是唯讀,在其他方面與不帶const的變數沒什麼區別

還有一種是const全域性變數或區域性變數,這兩種是相同的,區域性變數的作用域會和全域性變數相同

上**:

staticinti1;

intadd(inta,intb)

voidmain()

還有幾點static的特點,(適用於static全域性變數或區域性變數)

1.static變數在全域性資料區分配記憶體,也就是在生成的可執行檔案中佔一定空間,這點與全域性變數相同

2.static變數只在它所在的原始檔中可用.如果乙個專案有很多.

c或者.cpp檔案,static變數可以出現在每乙個檔案中,而他們卻是不同的,static可以解決許多檔案中變數名字相同的問題.

4樓:普姿宿沛

static

是c++中非常常用的修飾符,他被用來控制變數的儲存方式和可見性,下面我將從

static

修飾符的產生原因、作用談起,全方面分析static

修飾符的實質。

static

的兩大作用:

一、控制儲存方式:

static被引入以告知編譯器,將變數儲存在程式的靜態儲存區而非棧上空間。

1、引出原因:函式內部定義的變數,在程式執行到他的定義處時,編譯器為他在棧上分配空間,大家知道,函式在棧上分配的空間在此函式執行結束時會釋放掉,這樣就產生了乙個問題:

如果想將函式中此變數的值儲存至下一次呼叫時,怎麼實現?

最容易想到的方法是定義乙個全域性的變數,但定義為乙個全域性變數有許多缺點,最明顯的缺點是破壞了此變數的訪問範圍(使得在此函式中定義的變數,不僅僅受此函式控制)。

2、解決方案:因此c++

中引入了static,用他來修飾變數,他能夠指示編譯器將此變數在程式的靜態儲存區分配空間儲存,這樣即實現了目的,又使得此變數的訪問範圍不變。

二、控制可見性和連線型別

:static更有乙個作用,他會把變數的可見範圍限制在編譯單元中,使他成為乙個內部連線,這時,他的反義詞為」extern」.

static作用分析總結:static總是使得變數或物件的儲存形式變成靜態儲存,連線方式變成內部連線,對於區域性變數(已是內部連線了),他僅改動其儲存方式;對於全域性變數(已是靜態儲存了),他僅改動其連線型別。

類中的static成員:

一、出現原因及作用:

1、需要在乙個類的各個物件間互動,即需要乙個資料物件為整個類而非某個物件服務。

2、同時又力求不破壞類的封裝性,即需求此成員隱藏在類的內部,對外不可見。

類的static成員滿足了上述的需求,因為他具有如下特徵:有獨立的儲存區,屬於整個類。

二、注意:

1、對於靜態的資料成員,聯結器會確保他擁有乙個單一的外部定義。靜態資料成員按定義出現的先後順序依次初始化,注意靜態成員巢狀時,要確保所巢狀的成員已初始化了。消除時的順序是初始化的反順序。

2、類的靜態成員函式是屬於整個類而非類的物件,所以他沒有this指標,這就導致了他僅能訪問類的靜態資料和靜態成員函式。

const

是c++中常用的型別修飾符,但我在工作中發現,許多人使用他僅僅是想當然爾,這樣,有時也會用對,但在某些微妙的場合,可就沒那麼幸運了,究其實質原由,大多因為沒有搞清本源。故在本篇中我將對const進行辨析。溯其本源,究其實質,希望能對大家理解const有所幫助,根據思維的承接關係,分為如下幾個部分進行闡述。

c++中為什麼會引入const

c++的提出者當初是基於什麼樣的目的引入(或說保留)const關鍵字呢?,這是個有趣又有益的話題,對理解const非常有幫助。

1.大家知道,c++有乙個型別嚴格的編譯系統,這使得c++程式的錯誤在編譯階段即可發現許多,從而使得出錯率大為減少,因此,也成為了c++和c相比,有著突出好處的乙個方面。

2.c中非常常見的預處理指令

#define

variablename

variablevalue

能非常方便地進行值替代,這種值替代至少在三個方面好處突出:

一是避免了意義模糊的數字出現,使得程式語義流暢清晰,如下例:

#define

user_num_max

107這樣就避免了直接使用107帶來的困惑。

二是能非常方便地進行引數的調整和修改,如上例,當人數由107變為201時,進改動此處即可,

三是提高了程式的執行效率,由於使用了預編譯器進行值替代,並不必為這些常量分配儲存空間,所以執行的效率較高。

鑑於以上的好處,這種預定義指令的使用在程式中隨處可見。

3.說到這裡,大家可能會迷惑上述的1點、2點和const有什麼關係呢?,好,請接著向下

看來:預處理語句雖然有以上的許多好處,但他有個比較致命的缺點,即,預處理語句僅僅只是簡單值替代,缺乏型別的檢測機制。這樣預處理語句就不能享受c++嚴格型別檢查的好處,從而可能成為引發一系列錯誤的隱患。

4.好了,第一階段結論出來了:

結論:const

推出的初始目的,正是為了取代預編譯指令,消除他的缺點,同時繼承他的好處。

目前他的形式變成了:

const

datatype

variablename

=variablevalue

;為什麼const能非常好地取代預定義語句?

const

到底有什麼大神通,使他能振臂一揮取代預定義語句呢?

1.首先,以const

修飾的常量值,具有不可變性,這是他能取代預定義語句的基礎。

2.第二,非常明顯,他也同樣能避免意義模糊的數字出現,同樣能非常方便地進行引數的調整和修改。

3.第三,c++的編譯器通常不為普通const常量分配儲存空間,而是將他們儲存在符號表中,這使得他成為乙個編譯期間的常量,沒有了儲存和讀記憶體的操作,使得他的效率也非常高,同時,這也是他取代預定義語句的重要基礎。這裡,我要提一下,為什麼說這一點是也是他能取代預定義語句的基礎,這是因為,編譯器不會去讀儲存的內容,如果編譯器為const分配了儲存空間,他就不能夠成為乙個編譯期間的常量了。

4.最後,const定義也像乙個普通的變數定義相同,他會由編譯器對他進行型別的檢測,消除了預定義語句的隱患。

const

使用情況分類詳析

1.const

用於指標的兩種情況分析:

intconst

*a;file://a可變,*a不可變

int*const

a;file://a不可變,*a可變

分析:const

是個左結合的型別修飾符,他和其左側的型別修飾符和為乙個型別修飾符,所以,int

const

限定*a,不限定a。int

*const

限定a,不限定*a。

2.const

限定函式的傳遞值引數:

void

fun(const

intvar);**

const和static const的區別

5樓:楓璽

const和static const的區別:

一、全域性的區別

const規定變數在全域性中是唯讀的變數,並且它的值無法被修改。

static const規定變數在當前的模組中是唯讀的變數,無法再全域性中被其他模組讀取。

二、檔案的區別

const定義的指標,不賦初值編譯時不報錯,在初始化時應說明指標的指向。

static const不能在定義物件時對變數初始化,就是不能用建構函式來初始化。

三、函式的區別

const只能通過建構函式初始化列表進行,並且必須有建構函式。

static const是靜態的,屬於類的靜態成員函式。

四、類的區別

const資料成員只在某個物件生存期內是常量,而對於整個類而言卻是可變的。因為類可以建立多個物件,不同的物件其const資料成員的值可以不同,所以不能在類宣告中初始化const資料成員。

static const初始化在類體外進行,初始化時不加該成員的訪問許可權控制符private,public等,並且初始化時使用作用域運算子來標明它所屬類,因此,靜態資料成員是類的成員,而不是物件的成員。

全域性變數 與 static型的區域性變數 有什麼區別

extern變數和static變數都是從靜態儲存區域分配記憶體,即他們的儲存方式都一樣 從靜態儲存區域分配記憶體的特點是,內存在程式編譯時就已經分配好,這塊內存在程式執行期間都存在,這也就導致了全域性變數和static變數的生命期存在於整個程式執行中 即程式開始執行到程式結束 static變數分為兩...

貨幣與商品的區別與聯絡,貨幣與商品的區別與聯絡

區別 貨幣是一般等價物,能夠與其他一切商品相交換,表現其他一切商品的價值。聯絡 貨幣是商品交換發展到一定階段的產物,是從商品中分離出來的固定地充當一般等價物的商品。作為貨幣的貨幣與作為資本的貨幣的聯絡與區別?這兩種迴圈都分成同樣兩個對立階段 w g 賣 和g w 買 在其中每乙個階段上,都是同樣的兩...

男人與女人區別,男人與女人的區別?

女人發脾氣,那就可愛。男人發脾氣那就可惡。女 眼淚那就柔弱,男人那叫懦弱,女人花男人的錢那是天經地義。男人花女人的錢那叫天理不容。女人找男人只看長相,那是審美,男人找女人去看長相那是好色!正確認識男人和女人,才能更好相處,懂比愛更重要 懂得感恩的男人,不管你付出多少都能得到回報。不懂得感恩的男人,你...