引言:
結構化(即模塊化)程序設計中,基本單位是函數,模塊間對數據的共享方式只有兩種①函數與函數之間的參數傳遞;②全局變量。
面向對象中,兼顧數據的共享和保護①public:在類的內部,成員函數可以訪問任何數據和函數;②private::在類的外部,類的私有成員數據一切隱藏。
然而,同一個類的對象與對象之間也需要數據和函數的共享,靜態的成員數據和成員函數便是該類的屬性,而不屬於任何的實例對象。這是static關鍵字的由來。
1.靜態數據成員
源程序:
#include "stdafx.h"
#include<iostream>
using namespace std;
//定義類
class Point{
private:
int x,y;
static int count;//定義靜態成員數據
public:
Point(int x=0,int y=0):x(x),y(y){
count++;
}
Point(Point &p){
x=p.x;
y=p.y;
count++;
}
int getX(){ return x;}
int getY(){ return y;}
void showCount(){
cout<<"count="<<count;
}
};
int Point::count=0;//定義(第二次定義!)靜態成員數據,並初始化
//主函數
int _tmain(int argc, _TCHAR* argv[])
{
//定義一個對象a
Point a(4,5);
cout<<"Point A:"<<a.getX()<<","<<a.getY()<<endl;
a.showCount();
//定義一個對象b
Point b(a);
cout<<"Point B:"<<b.getX()<<","<<b.getY()<<endl;
b.showCount();
return 0;
}
【注意】
靜態成員數據聲明和初始化的方式(是在類外通過類名直接進行訪問並初始化!)。
2.靜態成員函數
源程序:
#include "stdafx.h"
#include<iostream>
using namespace std;
//定義類
class Point{
private:
int x,y;
static int count;//定義靜態成員數據
public:
Point(int x=0,int y=0):x(x),y(y){
count++;
}
Point(Point &p){
x=p.x;
y=p.y;
count++;
}
int getX(){ return x;}
int getY(){ return y;}
static void showCount(){
cout<<"count="<<count;
}
};
int Point::count=0;//定義(第二次定義!)靜態成員數據,並初始化
//主函數
int _tmain(int argc, _TCHAR* argv[])
{
Point::showCount();//對於靜態成員函數,可以通過類名來訪問(這就體現靜態數據和函數是該類本身的屬性,而不屬於任何對象)
//定義一個對象a
Point a(4,5);
cout<<"Point A:"<<a.getX()<<","<<a.getY()<<endl;
Point::showCount();
//定義一個對象b
Point b(a);
cout<<"Point B:"<<b.getX()<<","<<b.getY()<<endl;
Point::showCount();
return 0;
}
【注】
非靜態成員函數:只能通過對象來訪問;
靜態成員函數:可以通過類名和對象訪問(但一般使用類名直接訪問)。
3.靜態成員函數與靜態成員數據
class A{
public:
static void func(A a);
private:
int x;
};
void A::func(A a){
cout<<x;//非法
cout<<a.x;
}
【注意】
靜態成員函數:可以直接訪問靜態成員數據和成員函數;
如果訪問非……,只能通過對象引用。