1》静态成员和静态函数只在本文件中有效,出了这个文件,即使定义同样的数据成员和同样的静态函数也不会引起错误,所以可以起到避免冲突的效用


2》全局静态变量在同一个文件中只能定义一次,但是如果你后来再写一个同名的局部静态变量那是可以的,不过全局静态变量在同一个文件中只能有一个。而局部静态变量则有所不同,譬如:在一个函数中定义了局部静态变量,后来重复调用这个函数,而局部静态变量不等同于局部变量,函数结束的时候会销毁局部变量所在的栈,而局部静态变量是存放在静态存储区的,函数结束时并没有销毁静态存储区,那重复调用函数会不会出现重复定义的情况呢?事实上是第二次调用这个函数碰到局部静态变量的初始化得时候,不去管它了,跳过。所以我们的局部静态变量只占用一片静态存储区,并且可以保证其中的内容是我们上次操作的结果



今天将类中的静态数据成员和静态函数



先讲静态数据成员:



"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 
     
 
     
 
      
 
     

       注意:静态数据成员属于类,而不属于对象,事实上,这个静态变量可以实现各个对象之间的共享 
     
 
     
 
      
 
     

       静态函数 
     
 
     
"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; 
        
}

静态函数其实也是类的静态函数,不是属于对象的





https://blog.51cto.com/nnssll/208243