浅谈C++的this指针

一个关于C++很坑的问题,能够对this指针能够有更好的认识

代码

     
     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
     
     
class A {
public:
A( int x= 0): a(x) {}
void print() {
cout << "print ok" << endl;
}
void print_int() {
cout << "int = " << a << endl;
}
private:
int a;
};
int main( void)
{
A *p = NULL; //空指针 
p-> print(); //语句A
p->print_int(); //语句B
return 0;
}

错误的结论

上述代码是否有问题?
第一眼一看,程序试图通过一个NULL指针,访问成员函数,显然会出现 segmentation fault.

结果

语句A正确运行,而语句B 出现 segmentation fault.
语句B段错误可以理解,因为试图访问地址0,没有权限,所以段错误。但是为什么第一个print调用成功呢?
难道 -> 不是被编译器理解成(*p)吗?那么试图访问0地址,必然会段错误。

原因

C++对象模型为了提高空间和时间效率,static数据成员被放置到对象内部,static数据成员, static and nonstatic 函数成员均被放到对象之外

成员函数是独立于对象,可能会让大家很疑惑。static成员函数可以理解,但是non-static函数呢,如何去访问non-static成员变量呢?其实这是通过指向对象的this指针来实现的。成员函数是否具有指向对象的this指针,这就是non-static, 和static成员函数的区别所在。

现在也就可以理解上面的这段代码了。print() 和 print_int()都是non-static函数,所以它们具有 this 指针,指向绑定的对象。但是,
第一个语句 A *p = NULL; 将this指针赋值为NULL。

  • print()函数内部并没有试图访问成员变量,所以不需要对访问this指针。而函数的地址是独立于对象的,所以可以指针更具指针的类型,找到函数的定义。
  • print_int()内部需要访问成员变量a, 也就是 this->a,因此段错误。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值