静态成员函数不能用const修饰 ,也不能存取nonstatic数据

C++中静态成员函数不能用static修饰的原因:

static在c++中的第五种含义:用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局变量。

   不能用const的原因:一个静态成员函数访问的值是其参数、静态数据成员和全局变量,而这些数据都不是对象状态的一部分。而对成员函数中使用关键字const是表明:函数不会修改该函数访问的目标对象的数据成员。既然一个静态成员函数根本不访问非静态数据成员,那么就没必要使用const了。
   什么时候使用静态数据成员和静态函数呢?
      定义数据成员为静态变量,以表明此全局数据逻辑上属于该类。
      定义成员函数为静态函数,以表明此全局函数逻辑上属于该类,而且该函数只对静态数据、全局数据或者参数进行操作,而不对非静态数据成员进行操作。
 
   static的第一种含义:修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。
   static的第二种含义:修饰局部变量时,表明该变量的值不会因为函数终止而丢失。
   static的第三种含义:修饰函数时,表明该函数只在同一文件中调用。
   static的第四种含义:修饰类的数据成员,表明对该类所有对象这个数据成员都只有一个实例。即该实例归 所有对象共有。
   static的第五种含义:修饰类成员函数。
举个例子:
[cpp]  view plain  copy
  1. class AAA  
  2. {  
  3. public:  
  4.     static void display(voidconst  
  5.     {  
  6.         printf("m_a1 value is %d\n", m_a1);  
  7.         // 没有const,运行OK.  
  8.         // 有了const,报以下错.  
  9.         // error C2272: 'display' : modifiers not allowed on static member functions  
  10.   
  11.         // 问题一:  
  12.         // 译语个人理解是"修饰符不可用于静态成员函数"  
  13.         // 但明明没有修改什么.  
  14.         // 报错提示语究竟是什么意思?  
  15.     }  
  16.   
  17.     static int m_a1;  
  18. };  
  19.   
  20. int AAA::m_a1 = 100;  
  21.   
  22. int _tmain(int argc, _TCHAR* argv[])  
  23. {  
  24.     AAA::display();  
  25.   
  26.     return 0;  
  27. }  
书上至少应该说过,const的这种用法(indicate 不会修改当前对象的内容),
只能用于类的一般成员函数,而不能用于静态成员函数。

静态成员函数有什么不同?根本上说,静态成员函数里面没有this指针,
就是说,相当于一个定义于该类内部的普通(非成员)函数,
这也是为什么静态成员函数不能访问成员变量的原因,
所以,静态成员函数根本不存才“改变this指向的内容”这个概念,
结论(at last):const这个修饰符,用于静态成员函数没有意义。

因为static成员不是任何对象的组成部分,所以static成员不能被声明为const,毕竟将成员声明为const就是承诺不会修改该函数所属对象

猜你喜欢

转载自blog.csdn.net/jifeng7288/article/details/80270157
今日推荐