無論是針對變數還是函式:static作用都是修改變數的作用域
靜態成員包括靜態變數和靜態函式兩部分
靜態全域性變數
引入的原因(作用):隱藏變數(主要功能)
說明:即加了static,就會對其它原始檔隱藏。
具體來說,如果直接定義全域性變數,則該全域性變數相當於乙個專案變數,即是在整個專案的cpp中共享的,可以使用extern在別的cpp檔案中使用。而如果定義成靜態全域性變數,該全域性變數就變成了乙個檔案變數,即是在所在cpp檔案使用。
優點:利用其隱藏特性,可以在不同的檔案中定義同名函式和同名變數,而不必擔心命名衝突。
程式:
5、靜態資料成員的型別可以是自己類的型別,而普通資料成員則不可以。普通資料成員的只能宣告為 所屬類型別的指標或引用。#include using namespace std;
static int a;
void func1();
int main()
};int a::num=0;
void main()
舉例:
注意: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 靜態資料成員的定義。靜態資料成員實際是類域中的全域性變數,其定...