C++this指针的用途
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指针的用途相关推荐
- 类和对象——对象特性——this指针的用途
在C++中成员变量和成员函数是分开存储的.每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码. 那么问题是:这一块代码是如何区分是哪个对象调用自己的呢? C++通过提供特 ...
- C++ 中this指针的用途
先说结论: 1.形参和变量同名时,可用this指针来区分 2.在类的非静态成员函数中返回本身,可用return *this 1.区分形参和变量同名时: #include <iostream&g ...
- C++_类和对象_对象特性_This指针的用途_用来解决名称冲突_*this实现链式编程---C++语言工作笔记049
然后我们来看c++中的,this的使用,其实,我们知道java中也有this,这个c++中的this和java中的this 差不多.都是用来指代,对象的本身. 还是用代码去看看吧,c++中的this, ...
- 函数指针的用法以及用途详解
在C++中,指针是一个核心的部分,常规的指针用法作者已经在另外一篇文章中有过详细介绍,这篇文章主要是针对函数指针进行讨论. 首先我们先来认识一下函数指针的概念,我们平时在写函数的时候,调用函数时总是以 ...
- c语言指针尚观嵌入式,C语言-指针
本文目录 •直接引用 •一.什么是指针? •二.指针的定义 •三.指针的初始化 •四.指针运算符 •五.指针的用途举例 •六.关于指针的疑问 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针 ...
- C++中的函数指针和函数对象总结
篇一.函数指针 函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址. 函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参 ...
- 关于“指针的指针”的认识(值传递、指针传递区分)
[摘要]对于C语言的参数传递通常都是值传递,当传传递一个指针给函数的时,其实质上还是值传递.我们可以看以下常见的面试题: #include <stdio.h> #include <s ...
- C_C++指针指针应用详解
前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其 ...
- 把类成员改成指针_C++之this指针
this指针概念说明 前面一篇文章说到成员变量和成员函数是分开存储的. 每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码. 那么问题是:这一块代码是如何区分是哪个对象调 ...
最新文章
- 一篇带你了解TCP/IP 概念
- Python发送邮件(带附件)
- PullToRefreshListView下拉刷新与上拉载入
- 【算法+OpenCV】图像极坐标变换及基于OpenCV的实现
- optXXX方法,optBoolean
- OBD技术速成——J1850协议概述
- java 8 list,JAVA8 ListListInteger list中再装一个list转成一个list操作
- 无锡太湖学院计算机科学与技术宿舍,无锡太湖学院宿舍怎么样
- (转)60s快速分析Linux性能
- docker安装文档(多种方式)
- 韩服跑跑卡丁车 赛车大全
- 无人机巡检技术要点解读,无人机巡检方案实现
- Qgis的下载安装(Qgis3.16.12)
- Python生成汉字字库文字,以及转换为文字图片
- 3 什么是linux磁盘分区,3. Linux系统磁盘分区介绍
- 如何在Word文档中粘贴有行号的代码
- sklearn聚类算法实现
- 《需求工程——软件建模与分析》读书笔记
- 5000英镑就可买到控制美国核武库的同款IBM电脑
- SpringBoot 自定义实现一个启动器starter 教程。
热门文章
- C和指针之数组之编程练习2
- sqlite数据库备份还原、导出导入
- php的_auto,AutoPHPCheck下载
- 网站能拿到其他网站的cookie_如何设计网站能让网站建设的更有吸引力
- 土木工程到底有多惨?哭了哭了......
- 女儿学会走路了,是不是该教她学Python了?
- 轮子,辛苦你了。 | 今日最佳
- 遭央视曝光的“AI算命”,背后竟然隐藏了一个价值千亿的市场!?
- Mysql修改字段名和长度_mysql中修改表字段名/字段长度/字段类型详解
- wince导航_宁可用手机导航,也不用汽车导航?