C++静态成员函数不能调用非静态成员变量(详解)
发布时间:2020-12-16 05:15:37 所属栏目:百科 来源:网络整理
导读:其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话因为无论是静态成员函数还是静态成员变量,它们 都是在类的范畴之类的,及在类的整个生存周期里始终只能存在一份。然而非静态成员变量和非静态成员函数是针对类的对象而言。 然而从本
其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话因为无论是静态成员函数还是静态成员变量,它们 都是在类的范畴之类的,及在类的整个生存周期里始终只能存在一份。然而非静态成员变量和非静态成员函数是针对类的对象而言。 然而从本质上来说类的静态成员函数的函数形参中没有默认的this指针,导致不能调用具体实例对象的成员。 下面我们来测试一下: 先在静态成员函数中调用静态成员变量: #include <iostream> using namespace std; class vpoet { public: static int a; int b; public: vpoet(int data) { b=data; } static void statictestfun1() { cout<<"static a="<<a<<endl; } }; int vpoet::a=10; int main() { vpoet *V; V=new vpoet(5); vpoet::statictestfun1(); return 0; } 调用成功,截图如下 现在我们再静态成员函数中调用非静态成员变量 #include <iostream> using namespace std; class vpoet { public: static int a; int b; public: vpoet(int data) { b=data; } static void statictestfun1() { cout<<"static b="<<b<<endl; } }; int vpoet::a=10; int main() { vpoet *V; V=new vpoet(5); vpoet::statictestfun1(); return 0; } 编译下提示了错误: 大意是在静态成员函数中引用了类的非静态成员变量b。 其实这里可以再深入分析下: 静态成员变量的函数形参中没有默认的this指针指向类对象本身。所以当我们调用对象的非静态成员变量的时候它不能识别该变量 然而对于静态成员变量而言,其存在于整个类中,为每个类对象共有,所以就算没有默认的this形参仍然可以识别该静态成员变量 以上就是小编为大家带来的C++静态成员函数不能调用非静态成员变量(详解)全部内容了,希望大家多多支持编程小技巧~ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 在C#REST服务中验证ADAL JWT令牌
- 不了解动态数据绑定(bindPropety)的基础知识在Flex中
- 基于XML配置的Spring MVC(所需jar包,web.xml配置,处理器
- c# – 使用绑定到Text属性的DNN TextEditor字段更新数据源时
- swift – CUICatalog:无效请求:请求子类型,而不指定成语(
- postgresql – 窗口函数和更多“本地”聚合
- actionscript-3 – 当对象在Flash中有焦点时,如何删除黄色边
- ruby-on-rails – Rails迁移错误
- ruby – base64编码长度参数
- xmllint:删除<?xml version =“1.0”?>