浅谈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,因此段错误。

时间: 12-05

浅谈C++的this指针的相关文章

浅谈 “空指针、野指针、void*”

        Author: JW. Zhou Date: 2014/7/2 一.空指针(0/NULL) 返回NULL和返回0是完全等价的,因为NULL和0都表示空指针,换句话说:空指针是什么,就是一个被赋值为0的指针,在没有被具体初始化前,其值为0:NULL 是一个标准规定的宏定义,用来表示空指针常量. #define NULL 0   或者 #define NULL ((void*)0) 判断一个指针是否为空指针: f(!p) 和 if(p == NULL) ,if(NULL == p)

浅谈C中的指针和数组(一)

本文转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242138.html 在原文的基础上加入自己的想法作为修改. 指针是C/C++的精华,而指针和数组又是一对欢喜冤家,很多时候我们并不能很好的区分指针和数组,对于刚毕业的计算机系的本科生很少有人能够熟练掌握指针以及数组的用法和区别.造成这种原因可能跟现在大学教学以及现在市面上流行的很多C或者C++教程有关,这些教程虽然通俗易懂,但是在很多关键性的地方却避而不谈或者根本阐述不

浅谈C中的指针和数组(六)

数组和指针,原本不想在写了,觉得这部分差不多了,但是自己在写程序的时候还是发现了一个错误.首先说一下我的要求: 给一个函数传递一个二维数组,然后我想在这个函数里面计算这个数组的行数. 写个类似的错误DEMO代码弄上来: #include <stdio.h> #include <stdlib.h> void func(int a[][3]) { printf("%p\n", a); printf("%p\n", a[0]); printf(&q

浅谈C中的指针和数组(四)

原文转载地址:http://see.xidian.edu.cn/cpp/html/476.html 在原文的基础上增加自己的思想作为自己的修改 指针数组和数组指针的内存布局 初学者总是分不出指针数组与数组指针的区别.其实很好理解:指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定.它是“储存指针的数组”的简称.数组指针:首先它是一个指针,它指向一个数组.在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道.它是“指向数组的指针”的简称. 下面到底哪个

浅谈C中的指针和数组(五)

前面写了一些C指针和数组的一些知识,但是还有一些很重要的知识没有交代,这里做一个补充. 首先看一下,普通变量(指针也是变量)和数组名查看地址的方式是不同的. 查看数组变量的地址,不需要使用 & .C,C++语言中,对数组变量的操作,就相当于直接对该数组变量的地址的操作. #include<stdio.h> #include<stdlib.h> int main(void) { int arr[3]={1,2,3}; int a = 4; int *p = &a; p

浅谈C中的指针和数组(三)

原文转载地址:http://see.xidian.edu.cn/cpp/html/475.html 在原文的基础上增加自己的想法作为修改 很多初学者弄不清指针和数组到底有什么样的关系.我现在就告诉你:他们之间没有任何关系!只是他们经常穿着相似的衣服来逗你玩罢了. 指针就是指针,指针变量在32 位系统下,永远占4 个byte,其值为某一个内存的地址.指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到. 数组就是数组,其大小与元素的类型和个数有关.定义数组时必须指定其元素的类型和个数

浅谈RAII&智能指针

关于RAII,官方给出的解释是这样的"资源获取就是初始化".听起来貌似不是很懂的哈,其实说的通俗点的话就是它是一种管理资源,避免内存泄漏的一种方法.它可以保证在各种情况下,当你对对象进行使用时先通过构造函数来进行资源的分配和初始化,最后通过析构函数来进行清理,有效的保证了资源的正确分配和释放.(特别是在异常中,因为异常往往会改变代码正确的执行顺序,这就很容易引起资源管理的混乱和内存的泄漏) 其中智能指针就是RAII的一种实现模式,所谓的智能就是它可以自动化的来管理它所指向那份空间的资源

转: 浅谈C/C++中的指针和数组(二)

转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组的一些区别,然而在某些情况下,指针和数组是等同的,下面讨论一下什么时候指针和数组是相同的. C语言标准对此作了说明: 规则1:表达式中的数组名被编译器当做一个指向该数组第一个元素的指针: 注:下面几种情况例外 1)数组名作为sizeof的操作数 2)使用&取数组的地址 规则2:下标总是与指针的偏移量

转:浅谈C/C++中的指针和数组(一)

转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242138.html 浅谈C/C++中的指针和数组(一) 指针是C/C++的精华,而指针和数组又是一对欢喜冤家,很多时候我们并不能很好的区分指针和数组,对于刚毕业的计算机系的本科生很少有人能够熟练掌握指针以及数组的用法和区别.造成这种原因可能跟现在大学教学以及现在市面上流行的很多C或者C++教程有关,这些教程虽然通俗易懂,但是在很多关键性的地方却避而不谈或者根本阐述不清楚,甚至很