C++:this指针

目录

前言

成员函数返回this指向的对象本身时,为什是返回引用类型?

成员函数返回this对象本身时,内部通常会通过拷贝构造函数来创建一个临时对象?

总结


前言

c++通过提供特殊的对象指针,this指针 指向被调用的成员函数所属的对象

  • this指针是隐含每一个非静态成员函数内的一种指针
  • this指针不需要定义,直接使用即可
  • 当形参和成员变量同名时,可用this指针来区分
  • 在类的非静态成员函数中返回对象本身,可使用return *this

成员函数返回this指向的对象本身时,为什是返回引用类型?

        类似于 &b=a,修改b同时就是修改a,完全可以把b当做a,b就是a本身,但是如果返回的不是引用,就是 b=a,那就是创造一个新的变量。不能把b当做a用,所以类型去掉引用返回的不是b本身,而是b的副本

        当你直接返回一个 Person 对象时,每次调用 PersonAddPerson 函数都会创建一个新的 Person 对象。这是因为函数返回的是一个临时对象(即在函数内部创建的),而不是原对象本身。

        在 C++ 中,函数的返回值通常会通过拷贝构造函数(copy constructor)或移动构造函数(move constructor)生成一个临时对象。这样做是为了保证函数返回的对象是有效的且能够被使用。

        因此,如果 PersonAddPerson 函数直接返回一个新创建的 Person 对象,每次调用函数时都会生成一个临时对象。这样的设计可能会引入额外的资源开销,包括内存分配和对象构造等。

        如果你希望在原对象上进行修改而不是返回新对象,你可以使用引用类型作为函数的返回类型。通过返回引用类型,函数可以直接操作并修改原对象。这样可以避免创建新对象和资源开销。

#include <iostream>
using namespace std;class Person
{
public:Person(int age){// 1、当形参和成员变量同名时,可用this指针来区分this->age = age; // this->成员,类似结构体指针访问成员}Person& PersonAddPerson(Person p){this->age += p.age;return *this; // 返回对象本身}int age;
};void test01()
{Person p1(10);cout << "p1.age = " << p1.age << endl; // 10Person p2(10);/* 链式调用,第一次得到20,返回p2本身,再继续调用,最终加两次得到40(如果返回的是Person类型,这里得到的是20)*/p2.PersonAddPerson(p1).PersonAddPerson(p1).PersonAddPerson(p1);cout << "p2.age = " << p2.age << endl; // 40
}int main() {test01();return 0;
}

成员函数返回this对象本身时,内部通常会通过拷贝构造函数来创建一个临时对象?

        当一个函数返回一个对象时,编译器会使用拷贝构造函数来生成该返回对象的副本。拷贝构造函数是一个特殊的类成员函数,用于将一个对象的数据成员的值复制到另一个对象中。

假设我们有一个简单的类 Person,具有一个 name 字符串成员变量:

		class Person {public:std::string name;Person(const std::string& n) : name(n) {}// 拷贝构造函数Person(const Person& other) : name(other.name) {}};// 现在,我们有一个函数 getPerson(),它返回一个 Person 对象:Person getPerson() {Person p("Alice");return p;}

        在这个例子中,当 getPerson() 函数被调用时,它会创建一个 Person 对象 p,并将其初始化为 "Alice"。然后,函数将返回 p。

        在返回的过程中,编译器会使用拷贝构造函数来生成返回对象 p 的副本。这意味着在调用 getPerson() 后,将会创建一个新的 Person 对象,其中的 name 字符串值被复制为 "Alice"。这是因为我们不能直接返回函数内部的局部对象 p,因为它是在函数结束后将被销毁的。

        因此,拷贝构造函数在这里的作用是在函数返回对象时,根据已有对象的值创建一个新的对象,确保返回的对象是有效且具有正确的值。

总结

this指针是一个特殊的指针,用于访问当前对象的成员。它提供了一种便捷的方式来引用当前对象的成员变量和成员函数,并解决名称冲突的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

医疗设备智慧管理助力医院提质增效,阿基米德amp;健康界实践分享

近日&#xff0c;苏州阿基米德网络科技有限公司与医疗领域头部级媒体健康界&#xff0c;联合举办“数智为擎 提质增效——医学装备智慧管理创新发展论坛”的直播活动。 直播现场&#xff0c;来自上海交通大学医学院附属同仁医院、中华医学会航海医学分会、苏州阿基米德的专家们…

创投课程第四期 | Web3一级市场投资框架的演变及投资人能力框架的构成

协会邀请了来自Zonff Partners的合伙人——Colin&#xff0c;作为VC创投课程第4期的嘉宾&#xff0c;在北京时间12月9日(周六)下午14:00 PM-15:00 PM于蚂蚁链科技产业创新中心进行线下分享&#xff0c;届时将与所有对Web3投资、创业心怀热忱的朋友们共同探讨《WEB3一级市场投资…

在线学习平台-课程分页、用户管理

用户管理 添加功能增强 新增属性 若依里的用户模块(SysUser)是没有课程这一属性的,要实现我们自己的课程分页查询功能 这个位置传入的实体类SysUser要加上classId,记得加上get、set方法 更改sql语句 ctrl 鼠标左键不断点进去,查看调用位置 加入swagger文档: package com…

华为数通---配置本地端口镜像示例(1:1)

镜像概念 定义 镜像是指将指定源的报文复制一份到目的端口。指定源被称为镜像源&#xff0c;目的端口被称为观察端口&#xff0c;复制的报文被称为镜像报文。 镜像可以在不影响设备对原始报文正常处理的情况下&#xff0c;将其复制一份&#xff0c;并通过观察端口发送给监控…

Day34 贪心03

Day34 贪心03 1005.K次取反后最大化的数组和 先pass

Linux主机自动注册NPS客户端(脚本化)

参考官方对API使用方法的定义:https://ehang-io.github.io/nps/#/ 1、首先必须要在配置文件中开启 auth_key 并配置一个合适的密钥 2、修改脚本中的可变量参数,以适配自己的环境 #!/bin/bash# 脚本名称:npc_create.sh # 编写人:清瞳清 # 编写时间:2023-12-10 # 描述:这…

neuq-acm预备队训练week 8 P4779 【模板】单源最短路径(标准版)

题目背景 题目限制 题目描述 给定一个 n 个点&#xff0c;m 条有向边的带非负权图&#xff0c;请你计算从 s 出发&#xff0c;到每个点的距离。 数据保证你能从 s 出发到任意点。 输入格式 第一行为三个正整数n,m,s。 第二行起 m 行&#xff0c;每行三个非负整数 ui​,vi​…

Java第21章网络通信

网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。Java 已经将网络程序所需要的元素封 装成不同的类&#xff0c;用户只要创建这些类的对象&#xff0c;使用相应的方法&#xff0c;即使不具备有关的网络支持&#xff0c;也可 以编写出高质量的网络…

口袋参谋:如何对订单实现一键批量插旗?

​在淘宝店铺运营中&#xff0c;对宝贝订单标注插旗&#xff0c;也算是常态了&#xff0c;至少90%的商家都不陌生&#xff0c;剩下的10%是刚入行的新手&#xff0c;正如我刚入行一样。 01 首先我们要了解什么是插旗&#xff1f; 其实就是淘宝店铺利用各种颜色的旗子来代表订单…

uniapp - 简单版本自定义tab栏切换

tab切换是APP开发最常见的功能之一&#xff0c;uniapp中提供了多种形式的tab组件供我们使用。对于简单的页面而言&#xff0c;使用tabbar组件非常方便快捷&#xff0c;可以快速实现底部导航栏的效果。对于比较复杂的页面&#xff0c;我们可以使用tab组件自由定义样式和内容 目录…

Redis为什么是单线程的?

Redis为什么是单线程的&#xff1f; 1.代码更清晰&#xff0c;处理逻辑更简单&#xff1b; 不2.用考虑各种锁的问题&#xff0c;不存在加锁和释放锁的操作&#xff0c;没有因为可能出现死锁而导致的性能问题&#xff1b; 3.不存在多线程切换而消耗CPU&#xff1b; 4.无法发挥多…

微服务学习:Nacos配置中心

先打开Nacos&#xff08;详见微服务学习&#xff1a;Nacos微服务架构中的服务注册、服务发现和动态配置&Nacos下载&#xff09; 1.环境隔离&#xff1a; 新建命名空间&#xff1a; 记住命名空间ID&#xff1a; c82496fb-237f-47f7-91ed-288a53a63324 再配置 就可达成环…