C++ this指针详解(精辟)
this 是 C++ 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。
所谓当前对象,是指正在使用的对象。例如对于stu.show();
,stu 就是当前对象,this 就指向 stu。
下面是使用 this 的一个完整示例:
1 #include <iostream>
2 using namespace std;
3 class Student{
4 public:
5 void setname(char *name);
6 void setage(int age);
7 void setscore(float score);
8 void show();
9 private:
10 char *name;
11 int age;
12 float score;
13 };
14 void Student::setname(char *name){
15 this->name = name;
16 }
17 void Student::setage(int age){
18 this->age = age;
19 }
20 void Student::setscore(float score){
21 this->score = score;
22 }
23 void Student::show(){
24 cout<<this->name<<"的年龄是"<<this->age<<",成绩是"<<this->score<<endl;
25 }
26 int main(){
27 Student *pstu = new Student;
28 pstu -> setname("李华");
29 pstu -> setage(16);
30 pstu -> setscore(96.5);
31 pstu -> show();
32 return 0;
33 }
运行结果:
李华的年龄是16,成绩是96.5
this 只能用在类的内部,通过 this 可以访问类的所有成员,包括 private、protected、public 属性的。
本例中成员函数的参数和成员变量重名,只能通过 this 区分。以成员函数setname(char *name)
为例,它的形参是name
,和成员变量name
重名,如果写作name = name;
这样的语句,就是给形参name
赋值,而不是给成员变量name
赋值。而写作this -> name = name;
后,=
左边的name
就是成员变量,右边的name
就是形参,一目了然。
注意,this 是一个指针,要用->
来访问成员变量或成员函数。
this 虽然用在类的内部,但是只有在对象被创建以后才会给 this 赋值,并且这个赋值的过程是编译器自动完成的,不需要用户干预,用户也不能显式地给 this 赋值。本例中,this 的值和 pstu 的值是相同的。
我们不妨来证明一下,给 Student 类添加一个成员函数printThis()
,专门用来输出 this 的值,如下所示:
1 void Student::printThis(){
2 cout<<this<<endl;
3 }
然后在 main() 函数中创建对象并调用 printThis():
1 Student *pstu1 = new Student;
2 pstu1 -> printThis();
3 cout<<pstu1<<endl;
4 Student *pstu2 = new Student;
5 pstu2 -> printThis();
6 cout<<pstu2<<endl;
运行结果:
0x7b17d8
0x7b17d8
0x7b17f0
0x7b17f0
可以发现,this 确实指向了当前对象,而且对于不同的对象,this 的值也不一样。
几点注意:
- this 是 const 指针,它的值是不能被修改的,一切企图修改该指针的操作,如赋值、递增、递减等都是不允许的。
- this 只能在成员函数内部使用,用在其他地方没有意义,也是非法的。
- 只有当对象被创建后 this 才有意义,因此不能在 static 成员函数中使用(后续会讲到 static 成员)。
this 到底是什么
this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 this。不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器默默地将它添加到参数列表中。
this 作为隐式形参,本质上是成员函数的局部变量,所以只能用在成员函数的内部,并且只有在通过对象调用成员函数时才给 this 赋值。
成员函数最终被编译成与对象无关的普通函数,除了成员变量,会丢失所有信息,所以编译时要在成员函数中添加一个额外的参数,把当前对象的首地址传入,以此来关联成员函数和成员变量。这个额外的参数,实际上就是 this,它是成员函数和成员变量关联的桥梁。
原文地址:https://www.cnblogs.com/ybqjymy/p/12171486.html
- 关于pl/sql的代码保护(r3笔记28天)
- Bilibili (B站)200万用户数据爬取与分析(附源码)
- 关于降低高水位线的尝试(r3笔记47天)
- 简单分析shared pool(二) (r3笔记48天)
- Python股票数据分析
- 简单分析shared pool(一) (r3笔记46天)
- 走索引扫描的慢查询(r3笔记45天)
- AR(I)MA时间序列建模过程——步骤和python代码
- 用python作信用卡欺诈预测
- 联系生活来简化sql(r3笔记第43天)
- [笔记]使用Python一步一步地来进行数据分析
- 使用 R 语言从拉勾网看数据挖掘岗位现状
- 使用strace分析exp的奇怪问题(r3笔记第41天)
- Python文本挖掘:知乎网友如何评价《人民的名义》
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 二分查找(Python实现)
- 图解JavaScript——代码实现【2】(重点是Promise、Async、发布/订阅原理实现)
- 编译器 bug 系列(1)
- 面试高频:反转链表
- 存储过程
- 为什么别人不想回答你提的问题?
- python面试题搜集:史上最全python面试题详解(一)
- 一日一技:在 Golang 中如何快速判断字符串是否在一个数组中
- 面试问题之操作系统
- 软技能提升:转转中后台规范落地实践
- python面试题搜集(三)
- 什么是计算机网络?为什么需要网络通信?如何进行网络编程?
- Python中好用又高效的Collections 模块
- 正确创建Python二维数组
- 深入理解Python内存管理与垃圾回收,再也不怕问了(一)