【C++】this 指针的概念

news2024/11/24 13:51:36

        欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。


目录

1、缘起

2、this 指针的用途

2.1、用途 1

2.1.1  解法 1 

2.1.2  解法 2 

2.2、用途 2 

2.3、用途 3 

3、总结 


1、缘起

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

        C ++ 通过提供特殊的对象指针,this 指针,解决上述问题。this 指针指向被调用的成员函数所属的对象。 this 指针是隐含每一个非静态成员函数内的一种指针,this 指针不需要定义,直接使用即可。

2、this 指针的用途

2.1、用途 1

当形参和成员变量同名时,可用 this 指针来区分,解决名称冲突。

示例代码 1: 

#include<iostream>
#include<string>

using namespace std;

class Person
{
public:
	Person(int age)
	{
		age = age;
	}

	int age;
};

int main()
{
	Person p(18);
	
	cout << "年龄:" << p.age << endl;

	cout << endl;
	system("pause");
	return 0;
}

        从上述代码和结果图中可以看出,当成员变量和形参相同时,对象 p 调用成员变量 age 时输出了一个乱码,并且编译器给出了一个警告,这说明了成员变量和形参不能相同。

        在编辑器中,当我们把鼠标放在形参 age 上时,构造函数 Person() 中的三个 age 都显示了阴影区域,这说明了这三个 age 是相同的。

        作为对照,把鼠标放在成员变量 age 上,只有成员变量的 age 显示了阴影区域,而构造函数中的 age 没有显示阴影区域,这说明了成员变量的 age 和 构造函数中的 age 不是同一份数据。所以,当给成员变量 age 赋值时,会出现赋值不成功。编译器同时也会报一个警告:
警告    C26495    未初始化变量 Person::age。始终初始化成员变量(type.6)。   
 

2.1.1  解法 1 

        对于上述报错问题,这里给出了第一种解法:就是给形参和成员变量取不同的名字。

示例代码 :

#include<iostream>
#include<string>

using namespace std;

class Person
{
public:
	Person(int age)
	{
		m_age = age;
	}

	int m_age;
};

int main()
{
	Person p(18);
	
	cout << "年龄:" << p.m_age << endl;

	cout << endl;
	system("pause");
	return 0;
}

2.1.2  解法 2 

        对于上述报错问题,这里也给出了第二种解法:使用 this 指针。this 指针指向的是被调用的成员函数所属的对象。这里 this 指针指向构造函数中的变量 age ,这说明了这个变量 age 就属于对象 p 了,成员变量 age 从而和形参进行了区分,这时就可以给成员变量 age 赋值成功。

#include<iostream>
#include<string>

using namespace std;

class Person
{
public:
	Person(int age)
	{
		this -> age = age;
	}

	int age;
};

int main()
{
	Person p(18);
	
	cout << "年龄:" << p.age << endl;

	cout << endl;
	system("pause");
	return 0;
}

2.2、用途 2 

在类的非静态成员函数中返回对象的本身,可使用 return *this。

示例代码 :

#include<iostream>
#include<string>

using namespace std;

class Person
{
public:
	Person(int age)
	{
		this->age = age;
	}

	Person& personAddAge(Person& p1)
	{
		this->age += p1.age;

        //this 指向 p2 的指针,而 *this 指向的就是 p2 这个对象本体
		return *this;
	}

	int age;
};

int main()
{
	Person p1(10);
	Person p2(10);
	
	p2.personAddAge(p1).personAddAge(p1).personAddAge(p1).personAddAge(p1);

	cout << "p2 的年龄:" << p2.age << endl;

	cout << endl;
	system("pause");
	return 0;
}

        在C++中,类的非静态成员函数中返回对象本身,意味着函数返回的是当前对象的一个副本或引用。这种用法允许我们在一个连续的操作序列中对同一个对象进行多个操作。 

2.3、用途 3 

在成员函数中访问其他成员函数:

示例代码: 

#include <iostream>
#include <string>

using namespace std;

class Person
{
public:

    void displayInfo1()
    {
        cout << "姓名:" << m_name << "    ";
        cout << "年龄:" << m_age << "    ";

        //使用 this 指针调用成员函数
        this->displayInfo2();
    }

    void displayInfo2()
    {
        cout << "住址:" << m_addr << endl;
    }

    string m_name = "胡图图";
    int m_age = 7;
    string m_addr = "翻斗大街翻斗花园二号楼 1001 室";
};

int main()
{
    Person p;

    p.displayInfo1();

    cout << endl;
    system("pause");
    return 0;
}

 

 

3、总结 

        在C++中,this指针是一个隐含的指针,指向当前对象的地址。它可以在成员函数内部使用,用于引用调用该函数的对象自身。以下是关于this指针的用法总结。

①  区分成员变量和局部变量:当成员变量与局部变量同名时,使用 this 指针可以明确指示成员变量。这样可以避免命名冲突并确保正确引用。

②  在成员函数中访问其他成员函数:this 指针允许在一个成员函数中调用同一对象的其他成员函数。

③  在类的非静态成员函数中返回对象的本身:在C++中,类的非静态成员函数中返回对象本身,意味着函数返回的是当前对象的一个副本或引用。这种用法允许我们在一个连续的操作序列中对同一个对象进行多个操作。

        今天的分享总结就到这里了,如果有疑问的小伙伴,我们在评论区交流嗷~~~,笔者必回,我们下期再见啦 !!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/589131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络编程_TCP/IP四层协议分层

网络编程_TCP/IP四层协议分层 1. OSI七层协议模型 (open system interconnection)与TCP/IP四层协议分层2. 协议封装3. TCP 协议头部4.三次握手5.滑动窗口正常情况丢包情况 6.四次挥手 1. OSI七层协议模型 (open system interconnection)与TCP/IP四层协议分层 OSI七层协议模型 (…

珞珈一号夜间灯光数据校正流程

一、前言 随着珞珈一号夜间灯光数据的发射,其高分辨率等优异性能,可以为我国相关部门监测国内和全球宏观经济运行情况,为政府决策提供客观依据,珞珈一号理想情况下荷在15天内完成绘制全球夜光影像,提供我国或者全球GDP指数、碳排放指数、城市住房空置率指数等专题产品。 …

larvael dcat-admin 表单设置自定义样式

表单有些不是自己想要的样式想要覆写或者增加 可以如下 public function form() {​​​​​​​$this->column(6, function () {$this->dateRange(order_created_at.start, order_created_at.end)->label(下单时间)->setLabelClass([input-group]) // 设置样式-&…

盘点几个实现VLAN间路由的好方法

在真实的网络中&#xff0c;常常需要跨VLAN通信。 许多网络工作者通常选择一些方法来实现不同VLAN中的主机之间的相互访问&#xff0c;如单臂路由。 然而&#xff0c;由于单臂路由技术的一些限制&#xff0c;如带宽和转发效率&#xff0c;这种技术是很少使用。 三层交换机在…

SpringBoot 集成WebSocket详解

感谢参考文章的博主&#xff0c;关于WebSocket概述和使用写的都很详细&#xff0c;这里结合自己的理解&#xff0c;整理了一下。 一、WebSocket概述 1、WebSocket简介 WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器…

一文详解 Sa-Token 中的 SaSession 对象

Sa-Token 是一个轻量级 java 权限认证框架&#xff0c;主要解决登录认证、权限认证、单点登录、OAuth2、微服务网关鉴权 等一系列权限相关问题。 Gitee 开源地址&#xff1a;https://gitee.com/dromara/sa-token 本文将详细介绍 Sa-Token 中的不同 SaSession 对象的区别&#x…

由jar包冲突导致的logback日志不输出

一、前言 最近升级一个老项目&#xff0c;发面日志没有按照预期的生成。 1、resource下面有logback配置但没有生成日志 检查resource目录下&#xff0c;发现有logback.xml配置&#xff0c;但部署在服务器的项目没有按配置生成日志。于是启动本地tomcat发现日志按logback配置…

【创造一个源点去建图】【有等级限制的dijkstra(采用多次dijk方法处理)】昂贵的聘礼

昂贵的聘礼 题意分析 原题链接 题意分析 本题需要注意&#xff1a; 等级限制比较复杂&#xff0c;可以最后考虑本题说 由 B物品 可以换 A物品&#xff0c;想到了B节点可以走到A节点&#xff0c;所以构建图由于我们是要买一个点再开始换的&#xff0c;所以我们可以构建一个源点…

bird 2023 比赛总结

1. 引言 &#x1f4cc; 参加这场比赛的时间&#xff0c;应该是还剩一个月不到了&#xff0c;本来没啥想法&#xff0c;因为在忙一些其它的比赛或者是工作和个人上的烦心事&#xff0c;不过在看过了赛题分析后&#xff0c;整体给我感观是一道挺有意思的学习赛&#xff0c;不仅仅…

ESP32-CAM开发板 使用 sqlite3 数据库存储数据记录

忘记过去&#xff0c;超越自己 ❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-05-29 ❤️❤️ 本篇更新记录 2023-05-29 ❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &#x1f44d;收藏 ⭐️留言&#x1f4dd;&#x1f64…

Python - Pycharm 配置 autopep8 并设置快捷键

什么是 PEP8 官方&#xff1a;PEP 8 – Style Guide for Python Code | peps.python.org 中文翻译博客&#xff1a;https://www.cnblogs.com/ajianbeyourself/p/4377933.html PEP8 是 Python 官方推出的一套编码的规范&#xff0c;只要代码不符合它的规范&#xff0c;就会有…

iOS unable to find utility “pngcrush“, not a developer tool or in PATH

0x00 奇怪的Bug 很奇怪&#xff0c;还很蛋疼 T_T 前一秒还能 Build 成功&#xff0c;运行 后一秒直接 GG sh -c /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/S…

Win10系统更新时不小心中断了无法启动怎么办?

Win10系统更新时不小心中断了无法启动怎么办&#xff1f;有用户使用的Win10系统电脑在进行系统更新的时候&#xff0c;被自己误触了电脑导致更新进程中断了。那么遇到这样的情况我们怎么去进行问题的解决呢&#xff1f;接下来我们一起来看看以下的解决方法吧。 准备工作&#x…

flink写mysql报错Could not retrieve transation read-only status server

事务隔离级别前提下还是报错 SET GLOBAL tx_isolationREAD-COMMITTED; show global variables like wait timeout; 发现mysql是8小时。如果flnk超过8小时没有发送数据&#xff0c;invoke将会导致 mysql主动断开连接&#xff0c;而java侧并无感知。 解决问题&#xff0c;在使…

Benewake(北醒) TFmini-i-485/TF02-i-485/TF03-485 雷达Modbus协议在Python Tkinter模块上实现功能配置的GUI设计

目录 实验目的测试环境Python库需求Benewake(北醒) TF雷达接线示意图库安装说明例程运行展示 实验目的 实现485接口系列雷达Modbus协议在Python下Tkinter模块实现功能配置的GUI设计。 本例程主要功能如下&#xff1a; 1.设备连接&#xff08;已知雷达设备的波特率和站号&#…

C++11 auto类型推导

1.类型推导 C11引入了auto 和 decltype 关键字实现类型推导&#xff0c;通过这两个关键字不仅能方便地获取复杂的类型&#xff0c;而且还能简化书写&#xff0c;提高编码效率。 auto 类型推导的语法和规则 在之前的 C 版本中&#xff0c;auto 关键字用来指明变量的存储类型…

SSL/TLS协议核心原理解析与实战

什么是SSL/TLS SSL&#xff08;secure sockets layer&#xff0c;安全套接层&#xff09;安全传输技术。TCP是传输层的协议&#xff0c;但是它是明文传输的&#xff0c;是不安全的。SSL的诞生给TCP加了一层保险&#xff0c;为TCP通信提供安全及数据完整性保护。TLS只是SSL的升…

软件测试银行金融项目如何测?看看资深测试老鸟的总结,一篇足够...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化测试&#x…

如何获取ios打包证书

要获取ios证书&#xff0c;需要去苹果开发者中心注册苹果开发者账号&#xff0c;百度苹果开发者中心即可进入苹果开发者中心官网。 假如你还从来没注册过苹果开发者&#xff0c;你可以参考下面这篇文章先注册成为苹果开发者&#xff0c;必须要有苹果开发者账号才能生成ios打包…

电商客户消费预测模型-基于数千万真实在线零售数据__企业调研_论文科研_毕业设计

之前发过 《谁主沉浮&#xff1f;银行&#xff0c;消金&#xff0c;互联网公司的精准营销_智慧营销完全解读》介绍了智慧营销/精准营销目的是降低运营成本。但精准营销可以带来很多额外收益&#xff0c;例如提高销售利润&#xff0c;提高客户忠诚度&#xff0c;降低客户流失率&…