日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++ static与const用法详解

發(fā)布時(shí)間:2025/3/15 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ static与const用法详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

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)容可以改變。

  • 阻止一個(gè)變量被改變,可以使用const關(guān)鍵字。在定義該const變量時(shí),通常需要對(duì)它進(jìn)行初始化,因?yàn)橐院缶蜎](méi)有機(jī)會(huì)再去改變它了;???
  • 對(duì)指針來(lái)說(shuō),可以指定指針本身為const,也可以指定指針?biāo)傅臄?shù)據(jù)為const,或二者同時(shí)指定為const;???
  • 在一個(gè)函數(shù)聲明中,const可以修飾形參,表明它是一個(gè)輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值;???
  • 對(duì)于類(lèi)的成員函數(shù),若指定其為const類(lèi)型,則表明其是一個(gè)常函數(shù),不能修改類(lèi)的成員變量,類(lèi)的常對(duì)象只能訪(fǎng)問(wèn)類(lèi)的常成員函數(shù);???
  • 對(duì)于類(lèi)的成員函數(shù),有時(shí)候必須指定其返回值為const類(lèi)型,以使得其返回值不為“左值”。
  • const成員函數(shù)可以訪(fǎng)問(wèn)非const對(duì)象的非const數(shù)據(jù)成員、const數(shù)據(jù)成員,也可以訪(fǎng)問(wèn)const對(duì)象內(nèi)的所有數(shù)據(jù)成員;
  • 非const成員函數(shù)可以訪(fǎng)問(wèn)非const對(duì)象的非const數(shù)據(jù)成員、const數(shù)據(jù)成員,但不可以訪(fǎng)問(wèn)const對(duì)象的任意數(shù)據(jù)成員;
  • 一個(gè)沒(méi)有明確聲明為const的成員函數(shù)被看作是將要修改對(duì)象中數(shù)據(jù)成員的函數(shù),而且編譯器不允許它為一個(gè)const對(duì)象所調(diào)用。因此const對(duì)象只能調(diào)用const成員函數(shù)。
  • const類(lèi)型變量可以通過(guò)類(lèi)型轉(zhuǎn)換符const_cast將const類(lèi)型轉(zhuǎn)換為非const類(lèi)型;
  • const類(lèi)型變量必須定義的時(shí)候進(jìn)行初始化,因此也導(dǎo)致如果類(lèi)的成員變量有const類(lèi)型的變量,那么該變量必須在類(lèi)的初始化列表中進(jìn)行初始化;
  • 對(duì)于函數(shù)值傳遞的情況,因?yàn)閰?shù)傳遞是通過(guò)復(fù)制實(shí)參創(chuàng)建一個(gè)臨時(shí)變量傳遞進(jìn)函數(shù)的,函數(shù)內(nèi)只能改變臨時(shí)變量,但無(wú)法改變實(shí)參。則這個(gè)時(shí)候無(wú)論加不加const對(duì)實(shí)參不會(huì)產(chǎn)生任何影響。但是在引用或指針傳遞函數(shù)調(diào)用中,因?yàn)閭鬟M(jìn)去的是一個(gè)引用或指針,這樣函數(shù)內(nèi)部可以改變引用或指針?biāo)赶虻淖兞?#xff0c;這時(shí)const 才是實(shí)實(shí)在在地保護(hù)了實(shí)參所指向的變量。因?yàn)樵?/span>編譯階段編譯器對(duì)調(diào)用函數(shù)的選擇是根據(jù)實(shí)參進(jìn)行的,所以,只有引用傳遞和指針傳遞可以用是否加const來(lái)重載。一個(gè)擁有頂層const的形參無(wú)法和另一個(gè)沒(méi)有頂層const的形參區(qū)分開(kāi)來(lái)。
  • 總結(jié)

    以上是生活随笔為你收集整理的C++ static与const用法详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。