C++之this指针概念及用法

2023-11-04

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

C++通过提供特殊的对象指针,this指针,解决上述问题。
this指针指向被调用的成员函数所属的对象。

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

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

例如p1调用成员函数,则内部this指向p1,p2调用则this指针指向p2,以此类推。
在这里插入图片描述
注意:this本质上是个指针,谁调用就指向谁,所以可以解引用*this,也就是解引用成本体。

贴上代码:

#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
	int age1;
	string name1;
	Person(int age1, string name1)
	{
		age1 = age1;    //默认传入的age1三个都是一样的
		name1 = name1;  //默认传入的name1三个都是一样的
	}
};

class People
{
public:
	int age2;
	string name2;
	People()  //空的构造函数
	{

	}

	People(int age2, string name2)
	{
		this->age2 = age2;    //this指针指向调用这个函数的对象,this指针再给这个对象的age2赋值
		this->name2 = name2;  //解释同上
	}

	People& PersonAddAge(People p)  //为了能返回本体,必须用Person&
	{
		//this指针是指向调用这个函数的对象,就是下文的p4,而*this就是解引用成p4本体
		this->age2 += p.age2;  //this这个指针的age2+上传入的形参的age
		return *this;        //this指针解引用成本体对象,就是下文的p4
	}
};


void test01()
{
	cout << "01是错误示范,传入的形参在构造函数里,并没有赋值给外部声明变量" << endl;
	Person p1(1, "ZHLC");

	cout << "01的age为" << p1.age1 << endl;
	cout << "01的name为" << p1.name1 << endl;
	cout << endl;

}

void test02()
{
	cout << "02是正确示范,通过this指针把传入的形参赋给外部声明变量" << endl;
	People p2(2, "zhlc");
	cout << "02的age为" << p2.age2 << endl;
	cout << "02的name为" << p2.name2 << endl;
	cout << endl;
}

void test03()
{
	cout << "接下来是链式编程" << endl;
	People p3;
	p3.age2 = 3;
	People p4;
	p4.age2 = 4;
	p4.PersonAddAge(p3).PersonAddAge(p3).PersonAddAge(p3).PersonAddAge(p3).PersonAddAge(p3);
	cout << "p3的age为" << p4.age2 << endl;
}


int main()
{
	test01();
	test02();
	test03();
	system("pause");
}

注释有写,看注释看的明白~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++之this指针概念及用法 的相关文章

随机推荐

  • 信奥赛一本通 C++题解 2034【例5.1】反序输出

    2034 例5 1 反序输出 时间限制 1000 ms 内存限制 65536 KB 提交数 23315 通过数 9932 题目描述 输入n 个数 要求程序按输入时的逆序把这n个数打印出来 已知整数不超过100个 也就是说 按输入相反顺序打印
  • Element-ui表单验证验证失败,input内有内容仍然验证为空的问题,验证数值类型不一致问题

    首先展示正确的格式 以验证是否为空为例 html代码块
  • QProcess 类使用总结

    背景 QProcess 类用于启动外部程序并与它们通信 QProcess 将进程视为I O 设备 可以对进程进行写入和读取 调用参数设置 同时指定路径和参数调用程序 QProcess process new QProcess this pr
  • 阿里云轻量级服务器安装--宝塔面板

    一 环境 1 服务器 阿里云轻量级服务器 2 环境 CentOS 7 6 二 安装 1 打开远程链接 2 输入安装命令 yum install y wget wget O install sh http download bt cn ins
  • js加密字符串

    字符串加密 用javascript对字符串进行加密 应用于参数传递等 默认加密密钥为kb1234 使用者可自定义修改 注意加密密钥应和解密密钥相同 算法来自于互联网 使用方法 加密 var code kbt encrypt 我爱北京天安门
  • 大算力时代已经到来

    计算机发展到现在 早已经历了大数据时代 而现如今国家也注意到国民大数据的重要性 而给予保护性条款和制度的建立 我觉得这只是早已注定的结局 但是未来该走向何方 着眼当下 我们互联网人早已身处在答案之中 大算力 Big Computing Po
  • 清除windows登录密码

    清除windows登录密码 原理 替换登录界面中的工具 登录界面中的轻松使用中的工具一般有放大镜 c Windows System32 Magnify exe 屏幕键盘 讲述人等 可以使用下列方法之一完成 命令行下的操作 替换后重启系统 点
  • 为什么打两拍可以消除亚稳态的影响?

    为什么打两拍可以消除亚稳态的影响 首先 我们需要了解什么是亚稳态 看下图 简单来说 就是当时钟信号上升沿到来的时候正好采样的数据也在发生变化 但是对于采样的时钟信号 如果想要采样得到一个稳定值 在clk的上升沿的前一段时间有一个建立时间TS
  • POP3协议分析

    感谢原作者 http blog csdn net bripengandre article details 2192111 POP3协议分析 第1章 POP3概述 POP3全称为Post Office Protocol version3 即
  • vue/js实现文件流下载,文件下载进度监听

    文档下载 通过文档请求 直接下载文档 url 请求路径 fileName 下载名称 size 文件大小 loadDown url fileName size var this this var xhr new XMLHttpRequest
  • django2.0.6 连接使用redis集群

    环境需要 django gt 1 8 x python 2 7 或者python gt 3 4 安装django cluster redis包 pip install django redis 注意 django redis版本需要 gt
  • springSecurity基本使用2(实现简单的登录功能)

    文章目录 前言 一 实现用户创建 登陆后才能访问接口 注重用户认证 1 定义一个内存用户 不使用默认用户 2 效果 3 退出登陆 4 再创建一个张三用户 同时支持多用户登陆 二 实现管理员功能 注重权限控制 1 创建一个普通用户demo 2
  • vue 项目代码混淆配置(自定义插件适用)带配置项注释

    文章目录 vue 项目代码混淆配置 自定义插件适用 带配置项注释 一 概要 二 混淆步骤 1 引入混淆插件 2 添加混淆配置 3 执行代码混淆 vue 项目代码混淆配置 自定义插件适用 带配置项注释 一 概要 本文章适用 vue cli3
  • clickhouse--副本、分片、Distributed

    副本的目的防止数据丢失 保证高可用 分片则是实现数据的水平切分 使用副本需要使用replicatedMergeTree存储引擎 MergeTree存储引擎存储数据时首先将数据写入内存缓冲区 然后数据被写入本地磁盘临时目录分区 待全部完成后再
  • Spring Boot 整合redis

    1 在pom xml 添加Spring Boot 的redis 依赖
  • zedboard @ vivado:SDK 加载失败

    参考链接 vivado SDK那些事儿 初试 宋桓公 vivado launch SDK ERROR Timed out 180 seconds have elapsed while waiting for XSDB server to l
  • iOS实训笔记—页面跳转与传值

    iOS开发实训第九周周报 学习知识点归纳 1 页面跳转的方式 1 UITableBarController 标签栏控制器 中的界面跳转 BOOL application UIApplication application didFinish
  • 移动端开发rem实现屏幕适配及处理页面加载页面坍塌样式错乱网页闪烁问题

    rem布局在加载的时候会出现元素一开始很小 闪烁一下恢复正常大小 问题的原因无非就是html一开始没有设置字体大小嘛 那我们就一开始按最常用的iPhone 6 尺寸 设置html的font size 50px 好了 设置html的font
  • 华为OD机试真题-水库蓄水 【2023.Q1】

    题目内容 山脉间建一个天热蓄水库 如何选取水库边界 使蓄水量最大 要求 山脉用正整数数组s表示 每个元素代表山脉的高度 选取山脉上两个点作为蓄水库的边界 则边界内的区域可以蓄水 蓄水量需排除山脉占用的空间 蓄水量的高度为两边界的最小值 如果
  • C++之this指针概念及用法

    我们知道在C 中成员变量和成员函数是分开存储的 每一个非静态成员函数只会诞生一份函数实例 也就是说多个同类型的对象会共用一块代码 那么问题是 这一块代码是如何区分那个对象调用自己的呢 C 通过提供特殊的对象指针 this指针 解决上述问题