C++核心技術篇(三)

類的靜態成員

首先,讓我們回顧一下靜態成員數據的概念。靜態數據在程序開始時即獲得空間,直到程序結束後才被回收。靜態成員可以聲明在函數體內也可以聲明在函數體外。那麼類可否有靜態成員呢?答案是肯定的。
類中的靜態成員和非靜態成員有很大區別。從使用上來講,調用靜態成員不需要實例化對象,而是以如下形式調用:

類名::靜態成員

從設計思想來看,靜態成員應該是類共用的。以人類爲例子,人有很多的屬性:姓名、年齡、身高等。顯然這些不是共用的,一個具體人的名字、年齡不能交給所有人使用。在人類中添加一個屬性:生存環境。具體以何種數據類型來表示他,視情況而定:好壞或質量等級,但重要的是,他一定是一個靜態變量。因爲對人類而言,生存環境是共用的。類中的靜態函數無法調用非靜態成員變量,非靜態成員變量在類未實例化是無法在內存中一直存在。若想在靜態函數中使用某些成員變量,可以在形參列表中實例化本類的對象,這樣在函數中可以使用該類的成員。
例:我們共有一個地球

//***human.h聲明瞭human類***//
#include<string>
using  std::string;
class human{
public:
string m_name;
human();
human(string nsme);
static int nTneEarth;
static void GetFeel(human h);
void Protect();
void Destroy();
};

human.cpp實現了human類,代碼如下:

#include"stdafx.h"
#include<human.h>
#include<iostream>
using std::endl;
using std::cout;

int human::nTheEarth=101;
human::human(){
m_name="nomame";
}
human::human(string name){
m_name-name;
}
void human::Destroy(){
human::nTheEarth-=20;
cout<<m_name<<"破壞了環境”<<endl;
}
void human::Protect(){
human::nTheEarth+=6;
cout<<m_name<<"盡微薄之力保護環境"<<endl;
}
void huamn::GetFeel(human h){
cout<<"環境現在的情況:";
if(nTheEarth>100)
couot<<"世界真美好"<<endl;
else if(nTheEarth>80)
cout<<"空氣還算新鮮但總覺得還差了一些"<<endl;
else if(nTheEarth>60)
cout<<"天不藍水不清,勉強可以忍受"<<endl;
else if(nTheEarth>40)
cout<<"樹木稀少,黃沙漫天"<<endl;
else if(nTheEarth>20)
cout<<"呼吸困難,水源稀缺"<<endl;
else if(nTheEarth>0)
cout<<"難道世界末日到了嗎?"<<endl;
if(nTheEarth<50){
cout<<"感到環境變得很糟糕"<<endl;
h.Protect();
}
}

程序入口代碼如下:

#include"stdafx.h"
#include<iostream>
#include"human.h"
using std::cout;
using std::endl;
int main(){
human h1("雷鋒");
human h2("某工廠老闆");
human h3("小明");
human::GetFeel(h3);
for(int day=0;day<4;day++){
h1.Protect();
h2.Destroy();
if(day%2==0)
h3.Destroy();
else
h3.Protect();
}
cout<<"現在的環境指數:"<<human::nTheEarth<<",看起來人類需要行到起來了。。。"<<endl;
for(int day=0;day<3;day++){
h1.protect();
human::GetFeel(h2);
h3.protect();
}
cout<<"現在的環境指數"<<human::nTheEarth<<endl;
return 0;
}

程序中,protect和destroy方法對靜態成員nTheEarth進行了操作。可以看出,每個human實例執行這兩個函數後,靜態成員nTheEarth都會變化,這個值是所有對象共用的。主函數使用區域符調用human類的靜態方法GetFeel().
和其他靜態變量一樣,類的靜態成員也需要初始化。初始化類的靜態成員變量時必須在外部定義,而且要標明靜態變量的類型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章