一些关于C++中static方法和static成员的个人认知

问题 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”的空间大小以及内存分布是已知的。

注:解释更多的是自己的思考,没有在教科书中读到相关解释,如果觉得合理,就请点个赞吧!
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值