C++ static与const用法详解
目錄
static的作用:
對(duì)普通變量:
1.局部變量:
2.全局變量
對(duì)類(lèi)中變量:
1.成員變量
2.成員函數(shù)
const的作用:
static的作用:
對(duì)普通變量:
1.局部變量:
在局部變量之前加上關(guān)鍵字static,局部變量就被定義成為一個(gè)局部靜態(tài)變量。
? 1)內(nèi)存中的位置:靜態(tài)存儲(chǔ)區(qū)
? 2)初始化:未經(jīng)初始化的全局靜態(tài)變量會(huì)被程序自動(dòng)初始化為0(自動(dòng)對(duì)象的值是任意的,除非他被顯示初始化)
? 3)作用域:作用域仍為局部作用域,當(dāng)定義它的函數(shù)或者語(yǔ)句塊結(jié)束的時(shí)候,作用域隨之結(jié)束。
?注:當(dāng)static用來(lái)修飾局部變量的時(shí)候,它就改變了局部變量的存儲(chǔ)位置(從原來(lái)的棧中存放改為靜態(tài)存儲(chǔ)區(qū))及其生命周期(局部靜態(tài)變量在離開(kāi)作用域之后,并沒(méi)有被銷(xiāo)毀,而是仍然駐留在內(nèi)存當(dāng)中,直到程序結(jié)束,只不過(guò)我們不能再對(duì)他進(jìn)行訪(fǎng)問(wèn)),但未改變其作用域。
2.全局變量
在全局變量之前加上關(guān)鍵字static,全局變量就被定義成為一個(gè)全局靜態(tài)變量。
1)內(nèi)存中的位置:靜態(tài)存儲(chǔ)區(qū)(靜態(tài)存儲(chǔ)區(qū)在整個(gè)程序運(yùn)行期間都存在)
2)初始化:未經(jīng)初始化的全局靜態(tài)變量會(huì)被程序自動(dòng)初始化為0(自動(dòng)對(duì)象的值是任意的,除非他被顯示初始化)
3)作用域:全局靜態(tài)變量在聲明他的文件之外是不可見(jiàn)的。準(zhǔn)確地講從定義之處開(kāi)始到文件結(jié)尾。
這里面值得注意的是,不管是局部變量、全局變量還是普通函數(shù),只要被static修飾了,其作用域只對(duì)自己的編譯單元有效(包含.h和.cpp文件),有static修飾變量的頭文件被其他文件包含,其他文件是不能使用該變量的。
注:static修飾全局變量,并未改變其存儲(chǔ)位置及生命周期,而是改變了其作用域,使當(dāng)前文件外的源文件無(wú)法訪(fǎng)問(wèn)該變量,好處如下:(1)不會(huì)被其他文件所訪(fǎng)問(wèn),修改;(2)其他文件中可以使用相同名字的變量,不會(huì)發(fā)生沖突。對(duì)全局函數(shù)也是有隱藏作用。而普通全局變量只要定義了,任何地方都能使用,使用前需要聲明所有的.c文件,只能定義一次普通全局變量,但是可以聲明多次(外部鏈接)。
注意:全局變量的作用域是全局范圍,但是在某個(gè)文件中使用時(shí),必須先聲明,使用extern關(guān)鍵字或者包含全局變量聲明的頭文件
對(duì)類(lèi)中變量:
1.成員變量
用static修飾類(lèi)的數(shù)據(jù)成員實(shí)際使其成為類(lèi)的全局變量,會(huì)被類(lèi)的所有對(duì)象共享,包括派生類(lèi)的對(duì)象。因此,static成員必須在類(lèi)外進(jìn)行初始化(初始化格式: int base::var=10;),而不能在構(gòu)造函數(shù)內(nèi)進(jìn)行初始化,不過(guò)也可以用const修飾static數(shù)據(jù)成員在類(lèi)內(nèi)初始化 。
特點(diǎn):
1)、不要試圖在頭文件中定義(初始化)靜態(tài)數(shù)據(jù)成員。在大多數(shù)的情況下,這樣做會(huì)引起重復(fù)定義這樣的錯(cuò)誤。即使加上#ifndef #define #endif或者#pragma once也不行。?
2)、靜態(tài)數(shù)據(jù)成員可以成為成員函數(shù)的可選參數(shù),而普通數(shù)據(jù)成員則不可以。
3)、靜態(tài)數(shù)據(jù)成員的類(lèi)型可以是所屬類(lèi)的類(lèi)型,而普通數(shù)據(jù)成員則不可以。普通數(shù)據(jù)成員的只能聲明為 所屬類(lèi)類(lèi)型的指針或引用。
2.成員函數(shù)
用static修飾成員函數(shù),使這個(gè)類(lèi)只存在這一份函數(shù),所有對(duì)象共享該函數(shù),不含this指針。
靜態(tài)成員是可以獨(dú)立訪(fǎng)問(wèn)的,也就是說(shuō),無(wú)須創(chuàng)建任何對(duì)象實(shí)例就可以訪(fǎng)問(wèn)。base::func(5,3);當(dāng)static成員函數(shù)在類(lèi)外定義時(shí)不需要加static修飾符。
在靜態(tài)成員函數(shù)的實(shí)現(xiàn)中不能直接引用類(lèi)中非靜態(tài)成員,可以引用類(lèi)中說(shuō)明的靜態(tài)成員。因?yàn)殪o態(tài)成員函數(shù)不含this指針。?
不可以同時(shí)用const和static修飾成員函數(shù)。
C++編譯器在實(shí)現(xiàn)const的成員函數(shù)的時(shí)候?yàn)榱舜_保該函數(shù)不能修改類(lèi)的實(shí)例的狀態(tài),會(huì)在函數(shù)中添加一個(gè)隱式的參數(shù)const this*。但當(dāng)一個(gè)成員為static的時(shí)候,該函數(shù)是沒(méi)有this指針的。也就是說(shuō)此時(shí)const的用法和static是沖突的。
總結(jié):(1)對(duì)于數(shù)據(jù)成員和普通數(shù)據(jù)可以使用static和const修飾 (2)對(duì)于成員函數(shù)不可同時(shí)使用static和const修飾,因?yàn)殪o態(tài)成員函數(shù)不屬于類(lèi),沒(méi)有this指針。
我們也可以這樣理解:兩者的語(yǔ)意是矛盾的。static的作用是表示該函數(shù)只作用在類(lèi)型的靜態(tài)變量上,與類(lèi)的實(shí)例沒(méi)有關(guān)系;而const的作用是確保函數(shù)不能修改類(lèi)的實(shí)例的狀態(tài),與類(lèi)型的靜態(tài)變量沒(méi)有關(guān)系。因此不能同時(shí)用它們。
const的作用:
1.限定變量為不可修改。
2.限定成員函數(shù)不可以修改任何數(shù)據(jù)成員。
用法如下:int?GetCount(void)?const;----在函數(shù)末尾加const關(guān)鍵字
3.const與指針:
const char *p 和char const *p都表示 指向的內(nèi)容不能改變。
char * const p,就是將P聲明為常指針,它的地址不能改變,是固定的,但是它的內(nèi)容可以改變。
總結(jié)
以上是生活随笔為你收集整理的C++ static与const用法详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: termux apache php,要啥
- 下一篇: C/C++常见库函数实现(memcpy、