类的静态数据成员/静态函数

在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; }
静态函数其实也是类的静态函数,不是属于对象的
相关文章
相关标签/搜索