C 靜態成員

2021-05-27 05:56:21 字數 2406 閱讀 4064

無論是針對變數還是函式:static作用都是修改變數的作用域

靜態成員包括靜態變數和靜態函式兩部分

靜態全域性變數

引入的原因(作用):隱藏變數(主要功能)

說明:即加了static,就會對其它原始檔隱藏。

具體來說,如果直接定義全域性變數,則該全域性變數相當於乙個專案變數,即是在整個專案的cpp中共享的,可以使用extern在別的cpp檔案中使用。而如果定義成靜態全域性變數,該全域性變數就變成了乙個檔案變數,即是在所在cpp檔案使用。

優點:利用其隱藏特性,可以在不同的檔案中定義同名函式和同名變數,而不必擔心命名衝突。

程式:

#include using namespace std;

static int a;

void func1();

int main()

};int a::num=0;

void main()

5、靜態資料成員的型別可以是自己類的型別,而普通資料成員則不可以。普通資料成員的只能宣告為 所屬類型別的指標或引用。

舉例:

class a

;

注意:

1、類中靜態成員變數 和 類中非靜態成員變數的對比

(1)  物件是否擁有

對於非靜態資料成員,每個類物件都有自己的拷貝,都擁有乙份自己的變數。

對於靜態資料成員,靜態資料成員是該類的所有物件所共有的。即無論這個類的物件被定義了多少個,靜態資料成員在程式中也只有乙份拷 貝,只分配一次記憶體,由該型別的所有物件共享訪問。

(2) 記憶體的分配

靜態資料成員儲存在全域性資料區。不能在類宣告中定義。

內部成員(非全域性,非靜態,非const變數)儲存在棧中。

2、類中靜態成員變數與全域性變數相比

(1) 靜態資料成員沒有進入程式的全域性名字空間,因此不存在與程式中其它全域性名字衝突的可能性;

(2 )可以實現資訊隱藏。靜態資料成員可以是private成員,而全域性變數不能;

為什麼要引入靜態資料成員:主要原因是為了取代全域性函式,能在呼叫建構函式前(未初始化類之前)呼叫,通常callback函式中會用得到。

什麼時候使用靜態資料成員:

(1) 為了訪問全域性變數或類的靜態資料成員

(2) 要呼叫乙個函式,該函式是在構造物件之前使用,但是不能使用全域性函式(不符合oo實現),而且類中非靜態函式的呼叫需要使用物件,這時候需要使用靜態成員函式。

語法:定義:static + 普通成員函式定義

定義位置:可以在類內,也可以自類外。類外定義是不加static

使用:類外使用:

訪問規則:public

使用方式:類名::靜態公有成員函式名(實參表);

注意:和普通的成員變數一樣,如果是私有或受保護的,不能在類外直接使用

類中使用:

訪問規則:public/protected/private

(可以是任意方式定義)

使用方式:直接使用靜態成員函式

性質:1、沒有this指標,不可以直接訪問類中非非靜態成員函式,常常用於訪問類的靜態資料和靜態成員函式。

2、只屬於乙個類,可以再多個物件間共享。

3、一般情況下,靜態成員函式不訪問非靜態成員函式,如果確實需要,則需要傳入引數通過物件名訪問。

4、靜態成員函式不可以同時宣告為virtual、const、volatile函式。

5、靜態成員函式不能是虛函式

舉例:

class   a

;

舉例:

#includeusing namespace std;

class a

static void show();

void show(const a&a);

};int a::j=0; //類外初始化靜態變數時,不要加static

void a::show()//類外定義函式體時,不要加static ----靜態函式訪問靜態成員

{ cout<1、類的靜態成員函式不能訪問非靜態成員,但是非靜態成員可以訪問靜態成員。

2、出現在類體外的函式定義不能指定關鍵字static;

3、靜態成員之間可以相互訪問,即靜態成員函式訪問靜態資料成員和訪問靜態成員函式;

4、非靜態成員函式可以任意地訪問靜態成員函式和靜態資料成員;

5、靜態成員函式不能訪問非靜態成員函式和非靜態資料成員;

6、呼叫靜態成員函式,可以用物件呼叫,也可以通過類呼叫

1、static與const的對比

變數的對比:

static:是為限定變數的作用域的,值是可以改變的

const:是表示變數是常量,是不可變的,提高程式健壯性。

函式的對比:

static:

修飾c++中的函式:是為了在物件建立之前做一些操作

const:

表示函式中的變數不可修改

C 靜態成員變數,靜態成員函式

資料成員可以分靜態變數 非靜態變數兩種.靜態成員 靜態類中的成員加入static修飾符,即是靜態成員.可以直接使用類名 靜態成員名訪問此靜態成員,因為靜態成員存在於記憶體,非靜態成員需要例項化才會分配記憶體,所以靜態成員不能訪問非靜態的成員.因為靜態成員存在於記憶體,所以非靜態成員可以直接訪問類中靜...

C 靜態成員 2 靜態資料成員

目錄 1.靜態成員的構造 2.靜態成員的訪問 3.靜態成員的初始化 include class a class b int main 輸出 b s constructor called 結論 程式只呼叫了b的建構函式,而沒有呼叫a的建構函式。原因很簡單,靜態成員僅僅在類宣告的時候而宣告,但是不會定義...

C 靜態成員和靜態成員函式

一 靜態資料成員 類體中的資料成員的宣告前加上static關鍵字,該資料成員就成為了該類的靜態資料成員。和其他資料成員一樣,靜態資料成員也遵守public protected private訪問規則。同時,靜態資料成員還具有以下特點 1 靜態資料成員的定義。靜態資料成員實際是類域中的全域性變數,其定...