目录
听说点赞的UU会有好运哦!
听说点赞的UU会有好运哦!
听说点赞的UU会有好运哦!
this指针:
面试常考this:
特别注意:
this指针:
类不保存成员函数,而是放在公共代码段(为什么?答案在C++类详解-CSDN博客)
那么,问题来了:
既然是同一个函数,按理说执行结果应该都是一样的
那么它是怎么做到不同的类对象执行不同的成员函数呢?
使用this指针
当对象1调用函数f()时,传参为f(&对象1)
当对象2调用函数f()时,传参为f(&对象2)
...
以此类推
而这个传参,是不是每一次都是我们自己来传呢?
不是,而是编译其来完成
用this指针
这个this就是当前类的指针
注意:
1、形参和实参的位置,我们不能显示写出来
2、在函数内部可以使用
f(const classname* const this){}
面试常考this:
this在那个区?
1、堆 (malloc)
2、栈(局部变量、形参)
3、静态区(static、全局变量)
4、常量区(const不在常量区,const修饰的是后面的对象)
5、对象内(成员变量)
所以,this是在栈区,因为this是一个形参
如果对象为空指针,但是却要调用对象的成员函数,如果这个成员函数没有对这个对象进行解引用,那就不会出错
只不过是对象的成员函数的参数this为空指针而已,我传一个空指针有问题吗?没有任何问题
但是,如果这个成员函数对this进行了解引用,就会出问题,出现空指针解引用的问题
例如下图中,创建了一个A类的对象,并且初始化为nullptr,同时对空指针进行了解引用,按道理来说,应该会出错才对,但是并没有,就是因为根本就没有用到这个空指针,所以也就不会进行解引用,而且,我们在编译阶段call的函数地址都是一样的,也再一次证明类的成员函数没有存储在类内部
特别注意:
因为对象的成员函数不是在对象内部的
所以,当要调成员函数的时候,并不需要用类的对象去进行调用
所以,即使是类的对象是一个空指针,也不会对这个空指针进行解引用
为什么?
因为,对象的成员函数的调用只需要一个this指针作为成员函数的参数
而这个this指针指向的是对象
那么,请问,我传参
是否在乎这个参数是空指针,还是非空指针呢?
不在乎
谁在乎?
只有成员函数内部是否需要对this进行解引用的时候才有关系