c++ 類的靜態(tài)成員
我們可以使用 static 關(guān)鍵字來(lái)把類成員定義為靜態(tài)的。當(dāng)我們聲明類的成員為靜態(tài)時(shí),這意味著無(wú)論創(chuàng)建多少個(gè)類的對(duì)象,靜態(tài)成員都只有一個(gè)副本。
靜態(tài)成員在類的所有對(duì)象中是共享的。如果不存在其他的初始化語(yǔ)句,在創(chuàng)建第一個(gè)對(duì)象時(shí),所有的靜態(tài)數(shù)據(jù)都會(huì)被初始化為零。我們不能把靜態(tài)成員放置在類的定義中,但是可以在類的外部通過(guò)使用范圍解析運(yùn)算符 :: 來(lái)重新聲明靜態(tài)變量從而對(duì)它進(jìn)行初始化,如下面的實(shí)例所示。
下面的實(shí)例有助于更好地理解靜態(tài)數(shù)據(jù)成員的概念:
#include <iostream> using namespace std; class box { public: static int objectcount; // 構(gòu)造函數(shù)定義 box(double l=2.0, double b=2.0, double h=2.0) { cout <<"constructor called." << endl; length = l; breadth = b; height = h; // 每次創(chuàng)建對(duì)象時(shí)增加 1 objectcount++; } double volume() { return length * breadth * height; } private: double length; // 長(zhǎng)度 double breadth; // 寬度 double height; // 高度 }; // 初始化類 box 的靜態(tài)成員 int box::objectcount = 0; int main(void) { box box1(3.3, 1.2, 1.5); // 聲明 box1 box box2(8.5, 6.0, 2.0); // 聲明 box2 // 輸出對(duì)象的總數(shù) cout << "total objects: " << box::objectcount << endl; return 0; }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
constructor called. constructor called. total objects: 2
1. 靜態(tài)函數(shù)成員
如果把函數(shù)成員聲明為靜態(tài)的,就可以把函數(shù)與類的任何特定對(duì)象獨(dú)立開來(lái)。靜態(tài)成員函數(shù)即使在類對(duì)象不存在的情況下也能被調(diào)用,靜態(tài)函數(shù)只要使用類名加范圍解析運(yùn)算符 :: 就可以訪問。
靜態(tài)成員函數(shù)只能訪問靜態(tài)數(shù)據(jù)成員,不能訪問其他靜態(tài)成員函數(shù)和類外部的其他函數(shù)。
靜態(tài)成員函數(shù)有一個(gè)類范圍,他們不能訪問類的 this 指針。您可以使用靜態(tài)成員函數(shù)來(lái)判斷類的某些對(duì)象是否已被創(chuàng)建。
下面的實(shí)例有助于更好地理解靜態(tài)函數(shù)成員的概念:
#include <iostream> using namespace std; class box { public: static int objectcount; // 構(gòu)造函數(shù)定義 box(double l=2.0, double b=2.0, double h=2.0) { cout <<"constructor called." << endl; length = l; breadth = b; height = h; // 每次創(chuàng)建對(duì)象時(shí)增加 1 objectcount++; } double volume() { return length * breadth * height; } static int getcount() { return objectcount; } private: double length; // 長(zhǎng)度 double breadth; // 寬度 double height; // 高度 }; // 初始化類 box 的靜態(tài)成員 int box::objectcount = 0; int main(void) { // 在創(chuàng)建對(duì)象之前輸出對(duì)象的總數(shù) cout << "inital stage count: " << box::getcount() << endl; box box1(3.3, 1.2, 1.5); // 聲明 box1 box box2(8.5, 6.0, 2.0); // 聲明 box2 // 在創(chuàng)建對(duì)象之后輸出對(duì)象的總數(shù) cout << "final stage count: " << box::getcount() << endl; return 0; }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
inital stage count: 0 constructor called. constructor called. final stage count: 2