最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++中的static關(guān)鍵字詳解

 更新時(shí)間:2022年03月22日 10:14:50   作者:-YIN  
這篇文章主要為大家詳細(xì)介紹了 C/C++中的static關(guān)鍵字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

static是 C/C++中的關(guān)鍵字之一,是常見的函數(shù)與變量(C++中還包括類)的修飾符,它常被用來控制變量的存儲方式和作用范圍。 在眾多高級語言中都有其作為關(guān)鍵字或函數(shù)出現(xiàn),所以這也是應(yīng)當(dāng)被程序員熟知其各種含義的一個單詞

在這里插入圖片描述

我們知道在函數(shù)內(nèi)部定義的變量,當(dāng)程序執(zhí)行到它的定義處時(shí),編譯器為它在棧上分配空間,函數(shù)在棧上分配的空間在此函數(shù)執(zhí)行結(jié)束時(shí)會釋放掉,這樣就產(chǎn)生了一個問題: 如果想將函數(shù)中此變量的值保存至下一次調(diào)用時(shí),如何實(shí)現(xiàn)? 最容易想到的方法是定義為全局的變量,但定義一個全局變量有許多缺點(diǎn),最明顯的缺點(diǎn)是破壞了此變量的訪問范圍(使得在此函數(shù)中定義的變量,不僅僅只受此函數(shù)控制)。static 關(guān)鍵字則可以很好的解決這個問題。

另外,在 C++ 中,需要一個數(shù)據(jù)對象為整個類而非某個對象服務(wù),同時(shí)又力求不破壞類的封裝性,即要求此成員隱藏在類的內(nèi)部,對外不可見時(shí),可將其定義為靜態(tài)數(shù)據(jù)。

在這里插入圖片描述

C/C++ 中的 static

這里 static 作用主要影響著變量或函數(shù)的生命周期,作用域,以及存儲位置。

1. 靜態(tài)局部變量

定義在函數(shù)內(nèi)部的變量稱為局部變量(Local Variable),它的作用域僅限于函數(shù)內(nèi)部, 離開該函數(shù)后就是無效的

當(dāng) static 修飾局部變量時(shí):

  • 變量的存儲區(qū)域由變?yōu)?strong>靜態(tài)常量區(qū)。
  • 變量的生命周期由局部變?yōu)?strong>全局。
  • 變量的作用域不變。

函數(shù)調(diào)用開辟棧幀,函數(shù)中的局部變量在棧上分配存儲空間,當(dāng)函數(shù)執(zhí)行完畢,函數(shù)棧幀銷毀,棧空間由系統(tǒng)回收

而在static修飾函數(shù)局部變量的時(shí),其修飾的靜態(tài)局部變量只執(zhí)行初始化一次,延長了局部變量的生命周期,直到程序運(yùn)行結(jié)束以后才釋放,但不改變作用域。

下面用代碼進(jìn)行驗(yàn)證:

#include <stdio.h>
 void fun()
{
	static int val = 0;   //static 修飾局部變量
	val++;
	printf("%d\n", val);
}
int main()
{
	for (int i = 0; i < 7; i++){
		fun();
	}
	return 0;
}

沒有 static 時(shí), 函數(shù)每調(diào)用一次, 變量就會進(jìn)行一次初始化值為 0,

當(dāng)由 static修飾時(shí), 初始化語句只會被執(zhí)行一次所以值會一直累加。

在這里插入圖片描述

2. 靜態(tài)全局變量

在所有函數(shù)外部定義的變量稱為全局變量(Global Variable),它的作用域默認(rèn)是整個程序,也就是所有的源文件,包括 .c 和 .h 文件。

當(dāng) static 修飾全局變量時(shí):

  • 變量的存儲區(qū)域在全局?jǐn)?shù)據(jù)區(qū)的靜態(tài)常量區(qū)。
  • 變量的作用域由整個程序變?yōu)?strong>當(dāng)前文件。(extern聲明也不行)
  • 變量的生命周期不變。

一個全局變量被 static 修飾,使全局變量只能在定義變量的當(dāng)前文件使用,不能在其余文件使用,即使 extern外部聲明也不行。

原因: 屬于文件作用域的聲明在缺省的情況下為 external 鏈接屬性, 如定義個全局變量int g_a = 1;a的鏈接屬性為external,而加上 static會修改變量的缺省鏈接屬性,改為internal。

聲明了全局變量 g_a 和 g_b (具有 external 鏈接屬性 )的其他源文件在使用這兩個變量時(shí)實(shí)際訪問的是生命與此處的這兩個變量;但是 g_c 只能由這個源文件訪問,因?yàn)殒溄訉傩?*為internal。

int g_a = 1;
extern int g_b;
static int g_c;

代碼驗(yàn)證:

// add.c
static int global_val = 27;   //static 修飾全局變量
 //staticdemo1.c
extern global_val;
 int main()
{
	printf("%d", global_val);
	return 0;
}

不用 static 修飾 global_val 時(shí)的結(jié)果

在這里插入圖片描述

而使用 static 修飾時(shí),鏈接時(shí)就會出現(xiàn)鏈接錯誤無法執(zhí)行。

在這里插入圖片描述

全局變量 與 extren

具有 extrenal 鏈接屬性的實(shí)體在其他語言術(shù)語中稱作全局實(shí)體(global entity ),所有源文件中的函數(shù)均可以訪問它。只要變量并非聲明與代碼塊或者函數(shù)定義內(nèi)部,它在缺省的情況下鏈接屬性即為 extrenal。如果一個變量聲明與代碼塊內(nèi)部,在它面前添加 extren 關(guān)鍵字將使它使它所引用的是全局變量而非局部變量。

具有鏈接屬性為 extrenal 的實(shí)體總是具有靜態(tài)存儲類型。 全局變量在程序開始執(zhí)行前創(chuàng)建,并在整個執(zhí)行過程中始終存在。從屬于函數(shù)的局部變量在函數(shù)在函數(shù)開始執(zhí)行時(shí)進(jìn)行創(chuàng)建,在函數(shù)執(zhí)行完畢后銷毀,但用于執(zhí)行函數(shù)的機(jī)器指令在程序生命周期內(nèi)一直存在。

使用 extren 進(jìn)行聲明提高代碼的可讀性是良好的編程習(xí)慣。

3. static 修飾函數(shù)

函數(shù)的作用域與全局變量一樣都是整個程序。

當(dāng) static 修飾函數(shù)時(shí):

函數(shù)的作用域由整個程序變?yōu)?strong>當(dāng)前文件。(extern聲明也不行)

一個函數(shù)被 static 修飾,使函數(shù)只能在定義的源文件使用,不能在其余文件使用,即使 extern外部聲明也不行。(同static 修飾全局變量)

如果我們將函數(shù)聲明為 static,就會把它的鏈接屬性從external,改為internal,這樣將使得其他源文件不能訪問這個函數(shù);對于函數(shù)而言,存儲類型不是問題,因?yàn)榇a總是存儲在只讀的代碼區(qū)中。

// add.c
static int add(int a, int b)
{
	return a + b;
}
 //staticdemo1.c
extern add(int a, int b);
 int main()
{
	printf("%d", add(10, 20));
	return 0;
}

這里直接看結(jié)果:

沒有 static 修飾:

在這里插入圖片描述

被 static 修飾:報(bào)了與修飾全局變量時(shí)同樣的鏈接錯誤。

在這里插入圖片描述

C++的 static 成員

聲明為static類成員稱為類的靜態(tài)成員,用static修飾的成員變量,稱之為靜態(tài)成員變量;用static修飾的 成員函數(shù),稱之為靜態(tài)成員函數(shù)

注:靜態(tài)的成員變量一定要在類外進(jìn)行初始化

class A
{
public :
	A(){   //構(gòu)造函數(shù)
		_count++;
	}
	A(const A& y){
		_count++;
	}
	static int GetCount(){    //靜態(tài)成員函數(shù)
		return _count;
	}
public:      
	int a;
	//靜態(tài)成員變量--》在類中的是聲明要在類外進(jìn)行定義
	static int _count;  
};
};
 int A::_count = 0;   //靜態(tài)變量 _count 定義
 void TestA() {
	cout << A::GetCount() << endl;  // 類靜態(tài)成員通過 類名::靜態(tài)成員 來訪問
	A a1, a2; 
	A a3(a1);
	cout << A::GetCount() << endl;
}

靜態(tài)成員變量 

1.靜態(tài)成員變量必須在類外進(jìn)行定義定義時(shí)不用加 static ,類中只是聲明

在這里插入圖片描述

2.靜態(tài)成員變量為所有類對象所共享,并沒有包含在具體的對象中。

所以并不影響 sizeof() 大小

3.靜態(tài)成員變量的訪問: 

  • 類名::靜態(tài)成員變量名 
  • 對象.靜態(tài)成員變量名。
cout << A::_count << endl;
cout << a1._count << endl;

在這里插入圖片描述

類的對象可以使用靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)。

注:靜態(tài)成員變量也受訪問限定符(public、protected、private)的限制。 所以私有的仍要通過類成員函數(shù)接口來進(jìn)行訪問,可以在通過類中公有的成員函數(shù)進(jìn)行訪問,

cout << A::GetCount() << endl;

但這種方式調(diào)用獲取靜態(tài)成員變量必須由靜態(tài)成員函數(shù)訪問,不能通過類名來調(diào)用類的非靜態(tài)成員函數(shù),否則就會出錯

在這里插入圖片描述

靜態(tài)成員函數(shù)

1.靜態(tài)成員函數(shù)沒有隱藏的 this 指針,不能訪問非靜態(tài)成員(變量、 函數(shù))!

在這里插入圖片描述

因?yàn)殪o態(tài)成員函數(shù)沒有隱藏的 this 指針?biāo)砸膊荒芏x成const成員函數(shù)(const 本質(zhì)就是修飾隱藏參數(shù)this )

在這里插入圖片描述

2.靜態(tài)成員函數(shù)不能調(diào)用非靜態(tài)成員函數(shù)。

在這里插入圖片描述

3.非靜態(tài)成員函數(shù)可以調(diào)用靜態(tài)成員函數(shù)。

static void fun(){
		_count = 0;
	}
	int GetCount(){
		//cout << this << endl;    
		fun();
		return _count;
	}

總結(jié):

(1) 靜態(tài)成員變量使用前必須先初始化(在類外定義),如:int A::_count = 0;

(2) 靜態(tài)成員變量為所有類對象所共享,也受訪問限定符(public、protected、private)的限制

(3) 靜態(tài)成員函數(shù)不能調(diào)用非靜態(tài)成員函數(shù),非靜態(tài)成員函數(shù)可以調(diào)用靜態(tài)成員函數(shù)

(4) 靜態(tài)成員函數(shù)沒有隱藏的 this 指針

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C++利用遞歸實(shí)現(xiàn)走迷宮

    C++利用遞歸實(shí)現(xiàn)走迷宮

    這篇文章主要為大家詳細(xì)介紹了C++利用遞歸實(shí)現(xiàn)走迷宮,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • QT實(shí)現(xiàn)簡單TCP通信

    QT實(shí)現(xiàn)簡單TCP通信

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)簡單的TCP通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 在C++中實(shí)現(xiàn)高效的數(shù)組原地輪轉(zhuǎn)的方法總結(jié)

    在C++中實(shí)現(xiàn)高效的數(shù)組原地輪轉(zhuǎn)的方法總結(jié)

    在 C++ 中,可以通過多種方式實(shí)現(xiàn)數(shù)組的輪轉(zhuǎn)操作,以下是幾種常見的實(shí)現(xiàn)方法及其對應(yīng)的代碼示例,文中通過代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2025-04-04
  • C++超詳細(xì)講解模板的使用

    C++超詳細(xì)講解模板的使用

    這篇文章主要介紹了C++中模板(Template)的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C語言實(shí)現(xiàn)階乘的示例詳解

    C語言實(shí)現(xiàn)階乘的示例詳解

    在現(xiàn)實(shí)中,我們做數(shù)學(xué)題總會遇到階乘問題,這在計(jì)算機(jī)中也不例外。 那我們應(yīng)該怎么實(shí)現(xiàn)呢?下面小編就為大家講解一下C語言中階乘的實(shí)現(xiàn)
    2022-07-07
  • Qt使用Quazip解壓縮、壓縮文件的實(shí)現(xiàn)

    Qt使用Quazip解壓縮、壓縮文件的實(shí)現(xiàn)

    Quazip是在zlib基礎(chǔ)上進(jìn)行了簡單封裝的開源庫,利用它可以很方便將單個或多個文件打包為zip文件,本文主要介紹了Qt使用Quazip解壓縮、壓縮文件的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • C++空類及沒有成員變量的類的大小實(shí)例分析

    C++空類及沒有成員變量的類的大小實(shí)例分析

    這篇文章主要介紹了C++空類及沒有成員變量的類的大小,對于初學(xué)者更好的了解C++的指針及類的存儲結(jié)構(gòu)很有幫助,需要的朋友可以參考下
    2014-07-07
  • C語言數(shù)據(jù)類型轉(zhuǎn)換實(shí)例代碼

    C語言數(shù)據(jù)類型轉(zhuǎn)換實(shí)例代碼

    本文主要介紹C 語言數(shù)據(jù)類型轉(zhuǎn)換,這里通過代碼實(shí)例進(jìn)行詳解,這是C語言基礎(chǔ)部分,需要的朋友可以參考下
    2016-07-07
  • C++模板實(shí)現(xiàn)順序棧

    C++模板實(shí)現(xiàn)順序棧

    這篇文章主要為大家詳細(xì)介紹了C++模板實(shí)現(xiàn)順序棧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • GCC編譯過程(預(yù)處理,編譯,匯編,鏈接)及GCC命令詳解

    GCC編譯過程(預(yù)處理,編譯,匯編,鏈接)及GCC命令詳解

    文章詳細(xì)介紹了GCC編譯器的工作原理,包括預(yù)處理、編譯、匯編和鏈接四個主要階段,每個階段都有其特定的任務(wù)和輸出文件,文章還解釋了如何使用GCC命令選項(xiàng)來查看每個階段的輸出,以及如何通過調(diào)整編譯選項(xiàng)來優(yōu)化程序性能或調(diào)試問題,感興趣的朋友跟隨小編一起看看吧
    2024-11-11

最新評論

高唐县| 杭锦后旗| 东安县| 中方县| 山阴县| 平江县| 丰原市| 马山县| 安徽省| 大关县| 山东省| 桦甸市| 勃利县| 鄂托克旗| 承德市| 平乡县| 中阳县| 沧源| 垣曲县| 静乐县| 延庆县| 曲水县| 社旗县| 姜堰市| 肃南| 岳阳市| 长垣县| 辰溪县| 瓦房店市| 鲜城| 桑日县| 桐庐县| 麻江县| 乐平市| 杨浦区| 陇川县| 河曲县| 张家界市| 河津市| 辉县市| 晴隆县|