this指针的用途:
1.当形参和成员变量同名时,可用this指针来区分。
2.在类的非静态成员函数中返回对象本身,可使用return *this

每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码,那么问题是:
这一块代码是如何区分哪个对象调用自己的呢?

C++通过提供特殊的对象指针,this指针解决上述问题。

对象p1,p2,p3都要调用这个函数,怎么区分是谁调用的呢?
用this指针解决这个问题

this指针指向被调用的成员函数所属的对象
简单来说,谁调用这个函数,this指针就指向谁。

1.this指针是隐含每一个非静态成员函数内的一种指针。
2.this指针不需要定义,直接使用即可。

1、解决名称冲突:
现在让我们看一下名称冲突问题:

#include <iostream>
using namespace std;class Person {public:Person(int age) {age = age;}int age;};//1.解决名称冲突void test01() {Person p1(18);cout << "p1的年龄为:" << p1.age << endl;}
//2.返回对象本身用*thisint main() {test01();return 0;
}

结果为0,如果你用的编译器是vs,结果应该是乱码,我用的是Dev-C++。

编译器会认为这3个age是同一个age,跟你这个属性age不是一回事,所以我们从来没有给这个属性age进行赋值操作。

解决方法:
1.成员属性和我们传入的形参名称不要同名。
2.使用this指针。

如何使用this指针呢?
代码如下:

#include <iostream>
using namespace std;class Person {public:Person(int age) {//this指针指向的是被调用成员函数所属对象this->age = age;}int age;};//1.解决名称冲突void test01() {Person p1(18);cout << "p1的年龄为:" << p1.age << endl;}
//2.返回对象本身用*thisint main() {test01();return 0;
}


此时编译器就这样认为了,所以就解决了这个问题。

2、返回对象本身用*this
首先先看这样一段代码:

#include <iostream>
using namespace std;class Person {public:Person(int age) {this->age = age;}int age;void PersonADDAge(Person &p) {this->age += p.age;}};//1.解决名称冲突//void test01() {//  Person p1(18);
//  cout << "p1的年龄为:" << p1.age << endl;
//
//}
//2.返回对象本身用*thisvoid test02() {Person p1(10);Person p2(10);p2.PersonADDAge(p1).PersonADDAge(p1).PersonADDAge(p1);cout << "p2的年龄为:" << p2.age << endl;}int main() {//  test01();test02();return 0;
}

我们的目的是让p2加3次p1的年龄,想要的p2年龄返回结果为40,可编译器报错,这是为什么呢?


因为我们第一次调用PersonADDAge这个函数后,返回的是void,所以就不能再调用这个PersonADDAge函数了,那如果我们可以让第一次调用这个函数后的返回值仍然是p2,那就可以再次调用这个函数,那我们要如何实现呢?
使用this指针。

代码如下:

#include <iostream>
using namespace std;class Person {public:Person(int age) {this->age = age;}int age;//如果要返回本体,要用引用的方式返回。Person &PersonADDAge(Person &p) {this->age += p.age;//this指向p2的指针,而*this指向的就是p2这个对象本体。return *this;}};//1.解决名称冲突//void test01() {//  Person p1(18);
//  cout << "p1的年龄为:" << p1.age << endl;
//
//}
//2.返回对象本身用*thisvoid test02() {Person p1(10);Person p2(10);//链式编程思想p2.PersonADDAge(p1).PersonADDAge(p1).PersonADDAge(p1);cout << "p2的年龄为:" << p2.age << endl;}int main() {//  test01();test02();return 0;
}

此时的结果就是40了。
那为什么要用引用呢?
引用指向本身内存,不用引用就是拷贝了,而拷贝指向另一个内存。

这里返回的不是指针或者引用,因为前面加了,所以返回的是p2本体。*


这个时候我们把这个引用删除,看看结果又是多少?
结果为:20

为什么呢?

因为此时返回的是一个拷贝的数据,每一次返回都是一个新的对象。

所以最后就第一次调用对真正的p2产生影响,所以结果为20

C++this指针的用途相关推荐

  1. 类和对象——对象特性——this指针的用途

    在C++中成员变量和成员函数是分开存储的.每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码. 那么问题是:这一块代码是如何区分是哪个对象调用自己的呢? C++通过提供特 ...

  2. C++ 中this指针的用途

    先说结论: 1.形参和变量同名时,可用this指针来区分 2.在类的非静态成员函数中返回本身,可用return  *this 1.区分形参和变量同名时: #include <iostream&g ...

  3. C++_类和对象_对象特性_This指针的用途_用来解决名称冲突_*this实现链式编程---C++语言工作笔记049

    然后我们来看c++中的,this的使用,其实,我们知道java中也有this,这个c++中的this和java中的this 差不多.都是用来指代,对象的本身. 还是用代码去看看吧,c++中的this, ...

  4. 函数指针的用法以及用途详解

    在C++中,指针是一个核心的部分,常规的指针用法作者已经在另外一篇文章中有过详细介绍,这篇文章主要是针对函数指针进行讨论. 首先我们先来认识一下函数指针的概念,我们平时在写函数的时候,调用函数时总是以 ...

  5. c语言指针尚观嵌入式,C语言-指针

    本文目录 •直接引用 •一.什么是指针? •二.指针的定义 •三.指针的初始化 •四.指针运算符 •五.指针的用途举例 •六.关于指针的疑问 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针 ...

  6. C++中的函数指针和函数对象总结

    篇一.函数指针 函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址. 函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参 ...

  7. 关于“指针的指针”的认识(值传递、指针传递区分)

    [摘要]对于C语言的参数传递通常都是值传递,当传传递一个指针给函数的时,其实质上还是值传递.我们可以看以下常见的面试题: #include <stdio.h> #include <s ...

  8. C_C++指针指针应用详解

    前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其 ...

  9. 把类成员改成指针_C++之this指针

    this指针概念说明 前面一篇文章说到成员变量和成员函数是分开存储的. 每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码. 那么问题是:这一块代码是如何区分是哪个对象调 ...

最新文章

  1. 一篇带你了解TCP/IP 概念
  2. Python发送邮件(带附件)
  3. PullToRefreshListView下拉刷新与上拉载入
  4. 【算法+OpenCV】图像极坐标变换及基于OpenCV的实现
  5. optXXX方法,optBoolean
  6. OBD技术速成——J1850协议概述
  7. java 8 list,JAVA8 ListListInteger list中再装一个list转成一个list操作
  8. 无锡太湖学院计算机科学与技术宿舍,无锡太湖学院宿舍怎么样
  9. (转)60s快速分析Linux性能
  10. docker安装文档(多种方式)
  11. 韩服跑跑卡丁车 赛车大全
  12. 无人机巡检技术要点解读,无人机巡检方案实现
  13. Qgis的下载安装(Qgis3.16.12)
  14. Python生成汉字字库文字,以及转换为文字图片
  15. 3 什么是linux磁盘分区,3. Linux系统磁盘分区介绍
  16. 如何在Word文档中粘贴有行号的代码
  17. sklearn聚类算法实现
  18. 《需求工程——软件建模与分析》读书笔记
  19. 5000英镑就可买到控制美国核武库的同款IBM电脑
  20. SpringBoot 自定义实现一个启动器starter 教程。

热门文章

  1. C和指针之数组之编程练习2
  2. sqlite数据库备份还原、导出导入
  3. php的_auto,AutoPHPCheck下载
  4. 网站能拿到其他网站的cookie_如何设计网站能让网站建设的更有吸引力
  5. 土木工程到底有多惨?哭了哭了......
  6. 女儿学会走路了,是不是该教她学Python了?
  7. 轮子,辛苦你了。 | 今日最佳
  8. 遭央视曝光的“AI算命”,背后竟然隐藏了一个价值千亿的市场!?
  9. Mysql修改字段名和长度_mysql中修改表字段名/字段长度/字段类型详解
  10. wince导航_宁可用手机导航,也不用汽车导航?