待用資料成員
·用關鍵字static聲明
·當聲明類的資料成員為靜態時,無論建立多少個類的對象,靜態成員都只有一個副本
·在類的所有對象中共用,具有靜態生存期
·若不存在其他的初始化語句,在建立第一個對象時,所有的待用資料成員被初始化為零
·在類外定義和初始化,用範圍解析運算子(::)來指明所屬的類
舉例:
#include <iostream>using namespace std;class Box {public:static int count; //若該待用資料成員在private部分聲明,則只能通過靜態成員函數處理Box(double l = 2.0, double b = 2.0, double h = 2.0) {cout << "One constructor was called." << endl;length = l, width = b, height = h;count++;//每建立一個對象時加1}double Volume() {return length * width * height;}~Box() { count--; }private:double length, width, height;};//初始化類Box的靜態成員int Box::count = 0;int main(void) {Box Box1(3.3, 1.2, 1.5);Box Box2(8.5, 6.0, 2.0);cout << "Total objects: " << Box::count << endl;//輸出對象的總數return 0;}
靜態成員函數
把成員函式宣告為靜態,就可以把函數與類的任何特定對象獨立開來
·在類對象不存在的情況下也能被調用,使用類名加範圍解析運算子 :: 即可訪問
·靜態成員函數只能訪問靜態成員資料、其他靜態成員函數和類外部的其他函數
·靜態成員函數有一個類範圍,不能訪問類的 this 指標,可以使用靜態成員函數來判斷類的某些對象是否已被建立
·用靜態成員函數訪問非靜態成員,需通過對象
舉例:
#include <iostream>using namespace std;class Box {public:static int count;Box(double l = 2.0, double b = 2.0, double h = 2.0) {cout <<"One constructor was called." << endl;length = l, width = b, height = h;count++;}double Volume() {return length * width * height;}static int getCount() {//靜態成員函數 return count;}private:double length, width, height;};int Box::count = 0;int main(void) {//在建立對象之前輸出對象的總數cout << "Inital Stage Count: " << Box::getCount() << endl;Box Box1(3.3, 1.2, 1.5);Box Box2(8.5, 6.0, 2.0);//在建立對象之後輸出對象的總數cout << "Final Stage Count: " << Box::getCount() << endl;return 0;}
註:
靜態成員函數與普通成員函數的區別:
·靜態成員函數沒有 this 指標,只能訪問靜態成員(包括靜態成員變數和靜態成員函數)
·普通成員函數有 this 指標,可以訪問類中的任意成員;而靜態成員函數沒有 this 指標
使用靜態成員瞭解構造與解構函式的調用情況
#include <iostream>using namespace std;class A {friend class B;//類B是類A的友元 public:static int value;static int num;A(int x, int y) {xp = x, yp = y;value++;cout << "調用構造:" << value << endl;}void displayA() {cout << xp << "," << yp << endl;}~A() {num++;cout << "調用析構:" << num << endl;}private:int xp, yp;};class B {public:B(int x1, int x2) : mpt1(x1 + 2, x2 - 2), mpt2(x1, x2) {cout << "調用構造\n";//mpt是類A的對象,有幾個mpt,有關類A的操作便執行幾次 }void set(int m, int n);void displayB();~B() {cout << "調用析構\n";//解構函式在類結束前調用,類結束的時候釋放類申請的空間} private:A mpt1, mpt2;//將A類的對象聲明為B類的私人資料成員 };int A::value = 0;int A::num = 0;void B::set(int m, int n) {mpt1.xp = m * 2, mpt1.yp = n / 2;}void B::displayB() {mpt1.displayA();}int main() {B p(10, 20);cout << "Hello world!" << endl;B displayB(); //通過友元,使類B輸出類A的私人資料成員return 0;}
相關文章:
C++靜態成員與常成員的使用
C++複習要點總結之五靜態成員變數及成員函數