您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“C++類的靜態數據成員和靜態成員函數怎么用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“C++類的靜態數據成員和靜態成員函數怎么用”這篇文章吧。
·用關鍵字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++類的靜態數據成員和靜態成員函數怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。