static關鍵字

引言:

結構化(即模塊化)程序設計中,基本單位是函數,模塊間對數據的共享方式只有兩種①函數與函數之間的參數傳遞;②全局變量。

面向對象中,兼顧數據的共享和保護①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;
}
 

【注意】

靜態成員函數:可以直接訪問靜態成員數據和成員函數;

                            如果訪問非……,只能通過對象引用。

 

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