C++——類數據成員和類成員函數
C++除了有屬於對象的成員——對象成員(或實例成員),還有屬於類本身的一種成員,稱之為類成員。
使用關鍵字static就可以創建一個類成員。
一、 類數據成員
static數據成員在類聲明的內部聲明,在任何程序塊之外定義(注意:不能在構造函數中初始化)。
????class Task { public: //…… private: static int n; }; int Task::n = 0; //定義(初始化)時不受private和protected訪問限制.
初始化為0不是必須,在任何程序塊之外定義的變量都自動初始化為0
注:不要試圖在頭文件中定義(初始化)靜態數據成員。在大多數的情況下,這樣做會引起重復定義這樣的錯誤。即使加上#ifndef #define #endif或者#pragma once也不行。
static數據成員不會影響該類及其對象的sizeof.
二、 類成員函數
static成員函數只能訪問其他的static成員(類數據成員和類成員函數)。
類成員函數可以為inline也可以為非inline
對於static成員的訪問,可以通過對象訪問,也能通過類來訪問。
??class A { public: static int x; //此處只為說明 static void Getx(); };
int main() { A a; a.Getx(); //通過對象訪問 A::Getx(); //通過類訪問 int m = a.x; int n = A::x; return 0; }
三、 在成員函數中定義static變量
如果成員函數中定義了static變量,則該類的所有對象調用該成員函數時將共享這個靜態變量
本例在成員函數m中定義了一個static變量s,由於s定義在程序塊內,它擁有程序塊范圍,因此它只能在m內部訪問。每調用m一次,s就會相應地增加一次。又因為m是C的成員函數,所以,C的所有對象都共享這個靜態局部變量。這樣,對m的每一次調用訪問的都是同一個s。相反,對於非靜態局部變量x來說,每個C對象都擁有一個x。所以,在main中第一次調用c1.m()將s從0增加到1,調用c2.m()將s從1增加到2,第二次調用c2.m()將s從2增加到3。