類的靜態數據成員/靜態函數

在c中我對全局靜態成員,局部靜態成員,靜態函數的基本理解以下:
1》靜態成員和靜態函數只在本文件中有效,出了這個文件,即便定義一樣的數據成員和一樣的靜態函數也不會引發錯誤,因此能夠起到避免衝突的效用
2》全局靜態變量在同一個文件中只能定義一次,可是若是你後來再寫一個同名的局部靜態變量那是能夠的,不過全局靜態變量在同一個文件中只能有一個。而局部靜態變量則有所不一樣,譬如:在一個函數中定義了局部靜態變量,後來重複調用這個函數,而局部靜態變量不等同於局部變量,函數結束的時候會銷燬局部變量所在的棧,而局部靜態變量是存放在靜態存儲區的,函數結束時並無銷燬靜態存儲區,那重複調用函數會不會出現重複定義的狀況呢?事實上是第二次調用這個函數碰到局部靜態變量的初始化得時候,不去管它了,跳過。因此咱們的局部靜態變量只佔用一片靜態存儲區,而且能夠保證其中的內容是咱們上次操做的結果
今天將類中的靜態數據成員和靜態函數
先講靜態數據成員:
#include "stdafx.h"
#include "iostream.h"

class circle
{
private:
  int x,y,r;
  static int num;
public:
  void print();
  void add();
  circle(int a,int b,int c);
};

void circle::print()
{
  cout<< "圓心:("<<x<< ","<<y<< ")"<<endl;
  cout<< "半徑:"<<r<<endl;
  cout<< "靜態量:"<<num<<endl<<endl;
}
void circle::add()
{
  num++;
}
circle::circle(int a,int b,int c)
{
  x=a;
  y=b;
  r=c;
}

int circle::num=0;//靜態數據成員必須初始化,而且也只有這麼一種引用模式,只能寫在這裏,寫在main函數裏面也是錯的

int main(int argc, char* argv[])
{

  circle p1(0,0,1);
  p1.add();
  p1.print();
  
        circle *p2= NULL;
  p2= new circle(0,0,2);
  p2->add();
  p2->print();

  delete p2;
  p2= NULL;

  return 0;
}
結果:
圓心:(0,0)
半徑:1
靜態量:1

圓心:(0,0)
半徑:2
靜態量:2

注意:靜態數據成員屬於類,而不屬於對象,事實上,這個靜態變量能夠實現各個對象之間的共享

靜態函數
#include "stdafx.h"
#include "iostream.h"

class circle
{
private:
  int x,y,r;
  static int num;
public:
  static void print(circle s);
  void add();
  circle(int a,int b,int c);
};

void circle::print(circle s)
{
//    cout<< "圓心:("<<x<< ","<<y<< ")"<<endl;//錯,靜態函數中不能調用非靜態數據成員
//    cout<< "半徑:"<<r<<endl;
  cout<< "靜態量:"<<num<<endl;
    cout<< "圓心:("<<s.x<< ","<<s.y<< ")"<<endl;
    cout<< "半徑:"<<s.r<<endl<<endl;
}
void circle::add()
{
  num++;
}
circle::circle(int a,int b,int c)
{
  x=a;
  y=b;
  r=c;
}

int circle::num=0;//靜態數據成員必須初始化,而且也只有這麼一種引用模式,只能寫在這裏,寫在main函數裏面也是錯的

int main(int argc, char* argv[])
{

  circle p1(0,0,1);
  p1.add();
  p1.print(p1);//能夠像其它函數同樣引用
  
        circle *p2= NULL;
  p2= new circle(0,0,2);
  p2->add();
  circle::print(*p2);//也能夠用類的方式引用

  delete p2;
  p2= NULL;   return 0; }
靜態函數其實也是類的靜態函數,不是屬於對象的
相關文章
相關標籤/搜索