C++静态成员函数不能调用非静态成员变量
来源:互联网 发布:oa系统和java关系 编辑:程序博客网 时间:2024/06/12 01:02
其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话因为无论是静态成员函数还是静态成员变量,它们都是在类的范畴之类的,及在类的整个生存周期里始终只能存在一份。然而非静态成员变量和非静态成员函数是针对类的对象而言。然而从本质上来说类的静态成员函数的函数形参中没有默认的this指针,导致不能调用具体实例对象的成员。
下面我们来测试一下:
先在静态成员函数中调用静态成员变量:
1 #include <iostream> 2 using namespace std; 3 4 class vpoet 5 { 6 public: 7 static int a; 8 int b; 9 10 public:11 vpoet(int data)12 {13 b=data;14 }15 16 static void statictestfun1()17 {18 cout<<"static a="<<a<<endl;19 }20 };21 22 int vpoet::a=10;23 24 int main()25 {26 vpoet *V;27 V=new vpoet(5);28 vpoet::statictestfun1();29 return 0;30 }
调用成功,截图如下:
现在我们再静态成员函数中调用非静态成员变量:
1 #include <iostream> 2 using namespace std; 3 4 class vpoet 5 { 6 public: 7 static int a; 8 int b; 9 10 public:11 vpoet(int data)12 {13 b=data;14 }15 16 static void statictestfun1()17 {18 cout<<"static b="<<b<<endl;19 }20 };21 22 int vpoet::a=10;23 24 int main()25 {26 vpoet *V;27 V=new vpoet(5);28 vpoet::statictestfun1();29 return 0;30 }
编译下提示了错误:
大意是在静态成员函数中引用了类的非静态成员变量b。
其实这里可以再深入分析下:
静态成员变量的函数形参中没有默认的this指针指向类对象本身。所以当我们调用对象的非静态成员变量的时候它不能识别该变量然而对于静态成员变量而言,其存在于整个类中,为每个类对象共有,所以就算没有默认的this形参仍然可以识别该静态成员变量
0 0
- C++静态成员函数不能调用非静态成员变量
- 为什么C++静态成员函数不能访问非静态成员变量、不能调用非静态成员函数?
- 静态成员函数调用非静态成员变量
- 静态成员函数调用非静态成员变量
- 用静态成员函数调用非静态成员变量
- 静态成员函数调用非静态成员变量
- 静态成员函数调用非静态成员变量
- 静态成员函数调用非静态成员变量
- 静态成员函数调用非静态成员变量
- 用静态成员函数调用非静态成员变量
- 静态成员函数调用非静态成员变量
- 静态成员函数调用非静态成员变量-p…
- 静态成员函数调用非静态成员变量-p…
- 静态成员函数如何调用非静态成员变量
- 静态成员函数调用非静态成员变量(转)
- 静态成员函数调用非静态成员变量
- 静态成员函数调用非静态成员
- 静态成员函数不能调用普通成员变量
- java forEach实现原理
- 农场灌溉问题ZOJ2412
- CDN 内容分发网络
- 关于派生类构造函数一个错误的理解?
- 第二章-函数
- C++静态成员函数不能调用非静态成员变量
- 点绕点旋转->点绕坐标轴旋转
- 说说我是如何一步一步的沦为美工沦为程序员的吧
- pdb — The Python Debugger
- 利用intent-filter和html超链接实现页面跳转
- 剑指offer-面试题23.从上往下打印二叉树
- VB9中循环程序语言(残缺版)
- myeclipse-10.7-offline-installer-windows安装图解及注意事项
- [POJ 1284] Primitive Roots (数论,原根)