static成员和static成员函数

来源:互联网 发布:网络黄金egd怎么回事 编辑:程序博客网 时间:2024/06/08 19:51

下面用一个简单的程序加以理解

[cpp] view plaincopyprint?
  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4.   
  5. class   Test     
  6. {  
  7.     public:  
  8.         static int j;  
  9.         static void   init();//init定义为static 或非static都可以修改static成员i的值  
  10.         static int revise_i(int x);  
  11.         int  get_i();   
  12.         //由于没有this指针,static成员函数不能反问对象的非static成员,用static输出k是非法的  
  13.       
  14.     private:  
  15.         static int i;  
  16.         int k;  
  17.         const static int r = 1; //只有const static 成员在类定义时初始化  
  18.         //若将上面的i直接初始化,编译时报错  
  19. };  
  20.   
  21. //外部定义时不能再标示static  
  22. int Test::i=0; //very important:外部定义(正好一次),之后i只能通过init修改  
  23. int Test::j=5; //j为public,之后可以直接访问和修改  
  24.   
  25. void   Test::init()  
  26. {  
  27.     i=10;  
  28. }  
  29.   
  30. int   Test::get_i()  
  31. {  
  32.     return   i;  
  33. }  
  34.   
  35. int Test::revise_i(int x)  
  36. {  
  37.     i = x;  
  38.     return i;  
  39. }  
  40.   
  41. int   main()  
  42. {  
  43.     Test   obj;  
  44.     cout << obj.get_i() << endl; //通过  
  45.     obj.init(); //私有的静态成员只能通过类的静态成员函数进行修改  
  46.     cout << obj.get_i() << endl;      
  47.     cout << Test::j << endl;  
  48.     obj.j = 15;  //公有的静态成员可以直接进行修改,访问方式可以obj.j或者Test::j  
  49.       
  50.     Test::revise_i(555);  
  51.     cout << "after revise_i, i = " << obj.get_i() << endl;  
  52.     cout << Test::j << endl;  
  53.     system("pause");  
  54.     return   0;  
  55. }  

static成员函数不可以声明为const的原因:

这是C++的规则const修饰符用于表示函数不能修改成员变量的值,该函数必须是含有this指针的类成员函数,函数调用方式为thiscall而类中的static函数本质上是全局函数,调用规约是__cdecl或__stdcall,不能用const来修饰。

原创粉丝点击