关于指向空的对象指针可以访问类的不包含成员变量的成员函数的原因


#include <iostream>
using namespace std;


class A { 
  int a;
  int b;
  public:
  void print(){
    cout << "abcd";
  }
  void print_a(){
    cout << a << endl;
  }
};

int main(void) {
  A *a = NULL;
  a->print(); //可以运行
  a->print_a();//出现段错误
  return 0;
}



暂时理解为以下:


可以参考python的方法来进行理解:

python 定义一个成员函数的方法为:print(self)

而通过对象调用该函数的时候通过a.print()来调用。也就是将对象a传入到print的self参数中。


再转回来:

c++中,每个对象都拥有一份独立的成员变量空间。而对于成员函数,并不是每个对象都拥有一份成员函数体而是所有的对象共用一份成员函数,程序编译之后,成员函数的地址就已经确定。成员函数的非虚函数由调用该函数的对象类型或者指针类型决定调用基类还是子类的函数块,然后直接进行调用,如果该函数用到了对象的成员变量,那么当遇到该变量时,将该变量自动转换为this->变量。

这是整个调用过程。

那么对于上述问题,指向空的对象指针,是可以调用该类的非静态且不包含成员变量的函数(不需要this指针)。然而当遇到成员变量后,调用该对象的this指针,为空,会出现段错误。


暂时做一下笔记,发现一篇博客比我这个解释清楚多了,介绍给大家:http://blog.csdn.net/starlee/article/details/2062586


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值