C++的This详解

本文详细解释了C++中this指针的作用,包括如何传递不同类对象的实例、this指针的位置(栈区),以及为何即使对象为空指针调用成员函数也可能不会出错。特别强调了成员函数调用时对this指针的依赖性及其在空指针情况下的处理方式。
摘要由CSDN通过智能技术生成

目录

听说点赞的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进行解引用的时候才有关系


 

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C语言中的strtok函数是用来分割字符串的。在使用strtok函数之前,我们需要包含<string.h>头文件。strtok函数使用一个指定的分隔符将字符串分割成多个子字符串,并返回分割后的第一个子字符串的指针。 下面是一个使用strtok函数的示例代码: ``` #include <stdio.h> #include <string.h> int main() { char str[] = "This is a sample string"; char *token; // 获取第一个子字符串 token = strtok(str, " "); // 继续获取其他的子字符串 while (token != NULL) { printf("%s\n", token); token = strtok(NULL, " "); } return 0; } ``` 输出结果为: ``` This is a sample string ``` 上述代码中,我们首先使用strtok函数将字符串str按照空格进行分割,并将第一个子字符串的指针赋给token。然后,我们通过循环继续获取其他的子字符串,直到token为NULL为止。 需要注意的是,strtok函数会破坏被分割字符串的完整性,调用前和调用后的字符串已经不一样了。如果需要保持原字符串的完整,可以使用其他方法,比如结合strchr和sscanf函数来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C/C++字符串函数strtok()详解](https://blog.csdn.net/ostarjennyo/article/details/127676519)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++ strtok函数详解](https://blog.csdn.net/weixin_45525272/article/details/114164364)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二十5画生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值