·用關鍵字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++類別的靜態資料成員與靜態成員函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!