變數的儲存型別:儲存型別按變數的生存期劃分,分動態儲存方式和靜態儲存方式。
1)動態儲存方式的變數,生存期為變數所在的作用域。即程式執行到此變數時才為其分配儲存空間,作用域結束時,會自動收回為其分配的儲存空間。
2)靜態儲存方式的變數,生存期為整個程式執行的過程。即程式開始時就為其分配儲存空間,程式結束時,才會收回為其分配的儲存空間。
4種變數的儲存型別:
1)自動型別(auto):動態儲存方式的變數,區域性變數,auto常常省略。
2)暫存器型別變數(register):動態儲存方式的變數,編譯器不為此型別變數分配儲存空間,而是直接使用cpu的暫存器。訪問速度快,主要用於控制迴圈次數等不需要長期儲存值的變數。
3)外部型別變數(extern):靜態儲存方式的變數,系統自動初始化值,又叫全域性變數,全域性變數是從作用域提出的,外部變數是從儲存方式提出的,表示了它的生存期。
4)靜態儲存變數(static):靜態儲存方式的變數,系統自動初始化值,靜態變數只能在它的作用範圍內使用。
static:靜態儲存變數的型別說明符。
static區域性變數:在函式內的區域性變數型別說明符前加上static說明符就構成靜態區域性變數。區域性變數變為靜態區域性變數,即改變了它的生存期。
voidfun()
1)static區域性變數在函式內定義。
2)static區域性變數的生存期是整個程式。
3)static區域性變數的作用域為函式體內。但再次呼叫定義此函式時,又可繼續使用此變數,而且儲存了前次被呼叫後留下的值。
intfun1()
intfun2()
int main(int argc, char*argv)
static全域性變數:在全域性變數型別說明符前加上static就構成靜態的全域性變數。全域性變數變成靜態全域性變數,即改變了它的作用域。
1)當乙個源程式由若干個原始檔組成時,在乙個原始檔中定義的外部變數要在其它的原始檔中使用,在使用前就用extern進行外部宣告。
2)如果在乙個原始檔中定義的外部變數不想讓其它原始檔使用,則必須宣告為static全域性變數,只能供所在的原始檔使用。同時可以避免在其它原始檔中引起錯誤。
//全域性變數
file1.cpp
intgnum;
main()
file2.cpp
extern
intgnum;
main()
//static全域性變數
file3.cpp
static
intgnum;
main()
static類成員變數:類的所有物件都用同乙個static成員變數。通過物件名或類名都可以呼叫。
classa;a a1,a2;
//建立了兩個a的物件
a1.x = 1; //
a::x = 1;或a2.x = 1;一樣,都是對static int x;操作,x = 1;
a1.y = 1; //
a1物件裡面y = 1;
a2.y = 2; //
a2物件裡面y = 2;
static類成員變數和普通資料成員一樣,不能在類的定義體中初始化,只能在類外進行初始化。但static const卻可以。
int y = 200;class
a;
static類成員函式:類的所有物件都用同乙個static成員函式。通過物件名或類名都可以呼叫。
1)static類成員函式沒有this指標。
2)static類成員函式不能被宣告為const和虛函式。
3)static類成員函式可以訪問所屬類的static成員變數,但不能使用非static成員變數。
classa;static
void
fun()
a a1;
a1.fun();
//或a::fun();
C 自我精講 基礎系列六 PIMPL模式
c 自我精講 基礎系列六 pimpl模式 0 前言 很實用的一種基礎模式。1 pimpl解釋 pimpl private implementation 或 pointer to implementation 是通過乙個私有的成員指標,將指標所指向的類的內部實現資料進行隱藏。2 pimpl優點 舉例 ...
C 自我精講 基礎系列三 過載
c 自我精講 基礎系列三 過載 0 前言 分二部分 函式過載,操作符過載。1 函式過載 函式過載 指在同一名字空間中,函式名稱相同,引數型別 順序或數量不同的一類函式,同一函式名的函式能完成不同功能。非函式過載,只是返回值不一樣 void fun int i int fun int i 非函式過載,...
C 自我精講 基礎系列五 隱式轉換和顯示轉換
c 自我精講 基礎系列五 隱式轉換和顯示轉換 1 c 的型別轉換分為兩種,一種為隱式轉換,另一種為顯式轉換。2 c 中應該盡量不要使用轉換,盡量使用顯式轉換來代替隱式轉換。定義 隱式轉換是系統跟據程式的需要而自動轉換的。1 c 型別 char,int,float,long,double等 的隱式轉換...