程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C/C++ static用法總結

C/C++ static用法總結

編輯:C++入門知識

C/C++ static用法總結




static用法
a.靜態局部變量,成為靜態局部變量(擁有記憶功能和全局存儲權限)
b.靜態全局變量(限制對應全局變量被被其他文件調用)
c.靜態函數
d.靜態類成員(標識此成員屬於類而非屬於某個特定對象)

1.靜態局部變量
1.1靜態局部變量在函數內定義,擁有靜態存儲期限而不再是自動存儲期限,因為靜態存儲期限的變量擁有永久的

存儲單元,所以在整個程序存儲期間都會保留變量的值,盡管退出函數後變量依然存在,但不能使用。


1.2靜態局部變量始終擁有塊作用域。(與自動變量作用域相同)


1.3對基本類型的靜態局部變量在定義時若為賦初值,則系統自動賦值為0.


1.4舉例如下:
void static_local_variable()
{
static int count = 0;
count++;
}


第一次進入此函數,靜態變量count被初始化為0(若不初始化,系統會自動初始化為0),接下來執行count++。

而之後調用此函數則只執行count++.


此函數與以下代碼實現同樣的功能:
int count = 0;
void fuc()
{
count++;
}


2.靜態全局變量
2.1靜態存儲期限。如同聲明為static的局部變量一樣,外部變量擁有靜態存儲期限,存儲在外部變量中的值獎

被永久的保留下來。


2.2文件作用域。外部變量擁有文件作用域;從變量被聲明的位置開始,一直到所在文件的末尾。因此,跟隨在

外部變量之後聲明的所有函數都可以訪問。


2.3舉例如下:
//xxxx.cpp
void fucOne()
{
sCount++;
count++;
}

static int sCount = 0;
int count = 0;

void fucTwo()
{
sCount++;
count++;
}

a.fucOne()定義在sCount和count變量之前,編譯時會提示未聲明標示符。而fucTwo()定義在兩變量之後,在

fucTwo()中則可正常使用。且在其他.cpp文件中不可訪問。


b.若兩個.cpp文件聲明了同名的全局變量,其本質為生命了兩個獨立的靜態全局變量。


c.count變量則可共享,在xxx.h文件中對其聲明 extern int count;在任何一個包含此頭文件的.cpp文件中初始化一次即可共享此全局變量。而同樣的方法卻不適用於靜態變量。
(強烈建議:不要將靜態/靜態變量定義在.h文件中)

3.static函數
3.1內部函數(static函數,不可再其他文件中調用)
如果在一個原文件中定義的函數只能被此源文件使用,則在函數類型前加 static 關鍵字即可。(利用了

static的文件作用域)


舉例如下:
static void fuc()
{
}


3.2外部函數(可在其他文件中調用)

舉例如下:

//file.cpp
[extern] void fuc()
{
}

//main.cpp
int main()
{
extern void fuc();
}

4.靜態類成員
4.1 類的靜態成員可以是private的或public的。靜態數據成員可以是常量、指針、引用、類類型等。
4.2 其靜態成員屬於類而非某個特定對象。其靜態成員函數中也不能使用this指針。
4.2 類靜態成員的使用
a.定義並初始化
一般來說,不能在類的內部初始化靜態數據成員,相反的,必須在類的外部定義和初始化每個靜態數據成

員。


舉例如下:
//xxxx.h
class A
{
private:
static int count;//聲明
public:
static void fuc();
}

int A::count = 0;//定義、初始化
(注意:最好將靜態數據成員的定義初始化放在對應的.cpp文件中,若像如上定義,在此頭文件被多次包含時,靜態成員會被重復定義)


b.類內初始化
如果某個數據成員的應用場景僅限於編譯器可以替換它的情況,則一個初始化的const或constexpr static不需要分別定義.
舉例如下:

class Account
{
public:
static doule fuc(){};
private:
static constexpr int NUM = 30;
int array[NUM];
}

相反若它將用於值不能替換的場景中,則該成員必須有一條定義語句:
舉例如下:
constexpr int Account::NUM;//只定義,不初始化,初始化已在類內提供
(建議:即使一個常量靜態數據成員在類內被初始化了,通常情況下也應該在類外定義一下該成員)

c.靜態成員的兩個應用
(1)靜態成員可以是不完全類型(不完全類型:只聲明,未定義)
(2)可以用靜態成員作為默認實參

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved