一些关于C++中static方法和static成员的个人认知
2016-03-27 17:38
253 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ankangyanghushi/article/details/50992777
问题 1:C++类的static成员方法为什么不能调用类中非static成员方法? 我曾用类之间的虚函数来证明:程序运行到类定义之后,类的普通成员方法的地址已经确定且唯一,即同一个类的所有对象相同方法的入口地址是相同且唯一的。那么没定义类对象时,类方法的入口地址已经确定,static成员方法为什么还不能调用普通成员方法呢? 有种解释是:在调用普通成员方法时,会传递类对象的给当前方法,而static调用普通成员方法(编译)时,类外(类内是可以定义类对象的,不过有点特殊)定义的类对象可能并没有定义,所以static成员不能调用普通成员方法。我觉得这只是表面现象,如果某些时候被调用的普通成员方法根本不需要知道是内对象的地址,那为什么还要传入对象地址呢?比如,该成员方法的主体可能是: `void print() { cout<<"hello world!"<<endl; }` 而它的入口地址对于该类的所有对象都是相同的,这时候根本不需要知道对象地址。那么C++在设计为什么规定:C++类的static成员方法为什么不能调用类中非static成员方法呢? 假如被调用的函数是这样: `void print() { cout<<"hello!"<<a<<endl;//a是类属性 }` 这时是需要传入类对象的。根本原因:在进行static成员方法编译,编译器无法确定static方法调用的普通成员方法是否需要传入对象(是否会访问属性),因为普通成员方法这个时候可能还未编译(如果在同一编译单元,static成员方法定义肯定写在普通成员之前,如果不是同一编译单元,编译的顺序是无法确定的),我想在设计C++语言时可能是考虑到这个原因才有此规定。 问题 2:C++类中为什么能定义本类的static成员对象? 我们都知道:类定义内部是不能定义本类对象(普通对象)的,但是能够定义该类对象的指针,原因在于前者需要知道内存的分布结构,而这时候类可能还未定义完全,后者只需分配4个字节的内存即可,且明确指向的类型(这时类已经声明)。 那么类内部为什么能够定义本类的static成员呢?例如: class A { public: static A a; private: int b; double c; }; 很明显,该类在定义属性“a”的时候还不知道“class A”的内部结构是怎样的,那编译器怎么知道给属性“a”分配多大的内存空间以及内存分布是怎样的。难道定义属性“a”不需要知道内存结构么?答案显然是否定的? static A a;其实只是一个声明,编译到该处时是不会分配内存空间的,只有在初始化的地方:"A A::a"才会分配内存空间,而这时类的定义已经编译,“class A”的空间大小以及内存分布是已知的。 注:解释更多的是自己的思考,没有在教科书中读到相关解释,如果觉得合理,就请点个赞吧!
相关文章推荐
- 关于C++ 从命令行输入数据 常用输方法cin的一些理解总结
- 关于spring boot中几种注入方法的一些个人看法
- Java基础--关于static的变量和方法使用的一些不解
- 关于静态方法static方法的一些新发现……
- 关于Vue中组件传值,以及emit方法的一些个人理解
- 关于线程方法的一些个人理解
- 关于C++ const成员的一些细节
- 关于static关键字的使用以及与成员方法、成员属性的总结
- 关于static关键字的使用以及与成员方法、成员属性的总结
- 关于static静态的一些知识(个人总结)
- 获取iframe中的内容、查找获取指定元素(关于用c++调用WEBBROWSER控件,使用相关接口操作web页面元素的一些方法)
- 关于C++读取文件时,在Windows和Linux下文本文件和二进制文件一些个人理解
- C++中关于类的链接问题的一些个人愚见
- 《黑马程序员》java笔记->【02】关于Static静态方法的一些注意事项
- 关于java jni调用c++动态库的一些问题及解决方法
- 关于培养色感,自己的一些方法
- 关于静态方法和实例方法的一些误区。
- 关于c++的一些注意事项
- 关于个人所得税的计算方法及税率
- 关于Editplus的一些使用方法