靜態變數和函式

2021-09-29 21:13:18 字數 3300 閱讀 9357

c++變數的作用域:

區域性變數只在定義它的**塊中可用。

靜態變數作用域取決於如何定義

類中宣告的成員變數作用域為整個類

命名空間中宣告的變數作用域為整個命名空間

c++函式的作用域:

整個類或整個命名空間,不能是區域性的,所以不能在**塊內定義函式

在函式中宣告的函式引數和變數的儲存持續性為自動,作用域為區域性,沒有鏈結性。

關於自動變數和棧:

自動變數的數目隨函式的開始和結束而增減,因此程式必須在執行時對自動變數進行管理。常用的方法時留出一段記憶體,並將其視為棧,以管理變數的增減。

當函式被呼叫時,其自動變數將被加入到棧中,棧頂指標指向變數後面的下乙個可用記憶體單元,函式結束時,棧頂指標被重置為函式被呼叫前的值,從未釋放新變數使用的記憶體。

靜態變數存在於整個程式執行期間

靜態變數儲存在靜態儲存區

int global =

1000

;//外部鏈結性的靜態變數(全域性變數),作用域為整個檔案,由於鏈結性為外部,所以其他檔案也可以使用

static

int one_file =50;

//內部鏈結性的靜態變數,作用域為整個檔案

void

fun1

(int n)

靜態變數初始化:靜態初始化(零初始化和常量表示式初始化)、動態初始化靜態初始化:在編譯器處理檔案時初始化

1)零初始化:如果沒有顯示地初始化靜態變數,則編譯器將靜態變數初始化為0(靜態陣列和結構將每個元素或成員的所有位都設定為0)

2)常量表示式初始化:編譯器僅根據檔案內容就可以計算表示式,將執行常量表示式初始化

動態初始化:變數將在編譯後初始化

注:所有靜態變數都被零初始化,而不管程式設計師是否顯示的初始化了它。

#include

int x;

int y =5;

long z =13*

13;const

double pi =

4.0*

atan

(1.0);

//首先,x,y,z,pi都被零初始化,然後y和z是被常量表示式初始化,pi需要呼叫函式atan(),

//需要等到該函式被鏈結且程式執行時進行動態初始化

即,全域性變數

單定義規則:變數只能有乙個定義。

c++中有兩種變數宣告:定義宣告(為變數分配儲存空間)和引用宣告(不分配儲存空間,因為它引用已有的變數)

引用宣告使用關鍵字extern,且不進行初始化;否則,宣告為定義宣告,導致分配儲存空間

double up;

//定義宣告

extern

int cats =20;

//定義宣告

extern

int blem;

//引用宣告

注:

1)在多個檔案程式中,只能在乙個檔案中定義乙個外部變數,使用該變數的其他檔案必須使用extern宣告它。

2)如果在函式中宣告了乙個於全域性變數同名的變數,該區域性變數會隱藏全域性變數。此時可以使用作用域解析符:: 放在變數前面,訪問全域性變數。如 ::global

將static限定符用於作用域為整個檔案的變數時,該變數的鏈結性將為內部。

static

int errors =5;

//內部鏈結性的靜態變數

void

main()

const全域性變數的鏈結性為內部,即,全域性const定義就像使用了static說明符一樣

所以可以把常量定義放在標頭檔案中,這就意味著每個檔案都有自己的一組常量,而不是所有檔案共享一組常量。

如果希望某個常量的鏈結性為外部時,則可以使用extern關鍵字來覆蓋預設的內部鏈結性

extern

const

int states =50;

//外部鏈結性的常量定義

此種情況下,單個const可以在多個檔案之間共享,因此只有乙個檔案可對其進行初始化,其他使用該常量的檔案中使用extern關鍵字來宣告它。

可以使用鏈結性為內部的靜態變數在同乙個檔案中的多個函式之間共享資料

即,將static限定符用於**塊中的區域性變數。

1)靜態區域性變數在**不處於活動狀態時仍然存在

2)如果初始化了靜態區域性變數,則程式只在啟動時進行一次初始化,多次呼叫對應函式,不會再次初始化(因靜態區域性變數記憶體單元的下乙個記憶體單元,儲存是否初始化的標誌位)

以下檢視了static區域性變數的記憶體情況。

1)所有函式的儲存持續性都是靜態的,即在整個程式執行期間都一直存在。預設情況下,函式的鏈結性為外部的,即可以在檔案間共享。

2)關鍵字static可以將函式的鏈結性設定為內部的,使之只能在乙個檔案中使用。還意味著可以在其他檔案中定義同名的函式,此靜態函式將覆蓋外部定義的函式

對每個非內聯函式,程式只能包含乙個定義。對於鏈結性為外部的函式來說,這意味著在多檔案程式中,只能有乙個檔案包含該函式的定義,但使用該函式的那個檔案都應該包含其函式原型。

內聯函式不受這項規則的約束,這允許程式中可以將內聯函式放在標頭檔案中。

語言鏈結性—鏈結程式要求每個不同的函式都有不同的符號名。c語言編譯器可能將spiff這樣的函式翻譯為_spiff,c++翻譯的為不同的符號。

c++中使用函式原型來指出要使用的約定:

extern

"c"void

spiff

(int);

//使用c語言鏈結

extern

void

spiff

(int);

//使用c++語言鏈結

extern

"c++"

void

spiff

(int);

//使用c++語言鏈結

靜態變數和非靜態變數

class string1 a和b編譯報錯,can not make a static referrence to no static filed s3,s4 分析 string s1 pingguo string s2 xiangjiao string s3 new string lizi str...

靜態變數和動態變數

首先,變數的儲存型別可分為四類 自動型別 auto 暫存器型別 register 靜態型別 static 外部型別 extern 動態變數 自動型別 auto 暫存器型別 register 靜態變數 靜態型別 static 外部型別 extern 屬於動態全域性變數,可以省略auto識別符號,因此,...

靜態變數,非靜態變數和final變數

package com.founder.bg.quartz.job 7 在程式執行時的區別 例項變數屬於某個物件的屬性,必須建立了例項物件,8 其中的例項變數才會被分配空間,才能使用這個例項變數。靜態變數不屬於某 9 個例項物件,而是屬於類,所以也稱為類變數,只要程式載入了類的位元組碼,10 不用建...