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.pswp.cn/news/212609.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212609.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212609.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

openssl 常用命令 pkcs12

openssl pkcs12 openssl pkcs12 官方文檔 1. 描述 The pkcs12 command allows PKCS#12 files (sometimes referred to as PFX files) to be created and parsed. PKCS#12 files are used by several programs including Netscape, MSIE and MS Outlook. pkcs12 命令是用來創…

Nodejs 第二十二章(腳手架)

編寫自己的腳手架 那什么是腳手架&#xff1f; 例如:vue-cli Angular CLI Create React App 編寫自己的腳手架是指創建一個定制化的工具&#xff0c;用于快速生成項目的基礎結構和代碼文件&#xff0c;以及提供一些常用的命令和功能。通過編寫自己的腳手架&#xff0c;你可以…

Linux和Windows環境下如何使用gitee?

1. Linux 1.1 創建遠程倉庫 1.2 安裝git sudo yum install -y git 1.3 克隆遠程倉庫到本地 git clone 地址 1.4 將文件添加到git的暫存區&#xff08;git三板斧之add&#xff09; git add 文件名 # 將指定文件添加到git的暫存區 git add . # 添加新文件和修改過的…

深入理解HTTP狀態碼及其在Web開發中的應用

在Web開發中&#xff0c;我們經常需要與服務器進行交互&#xff0c;以獲取或發送數據。為了實現這一目標&#xff0c;我們使用HTTP協議。HTTP協議是一種無狀態的、應用層的協議&#xff0c;它定義了客戶端和服務器之間的通信方式。在HTTP協議中&#xff0c;有五種常用的HTTP狀態…

Python高級算法——動態規劃

Python中的動態規劃&#xff1a;高級算法解析 動態規劃是一種解決多階段決策問題的數學方法&#xff0c;常用于優化問題。它通過將問題分解為子問題&#xff0c;并在解決這些子問題的基礎上構建全局最優解。在本文中&#xff0c;我們將深入講解Python中的動態規劃&#xff0c;…

vs2017+qt5.14.2遇到的問題

1、在安裝qt插件后&#xff0c;導入pro文件時&#xff0c;報 msvc-version.conf loaded but QMAKE_MSC_VER isn’t set 修改E:\Qt\Qt5.14.2\5.14.2\msvc2017_64\mkspecs\common\msvc-version.conf文件中添加

RabbitMQ學習筆記10 綜合實戰 實現新商家規定時間內上架商品檢查

配置文件&#xff1a; 記住添加這個。 加上這段代碼&#xff0c;可以自動創建隊列和交換機以及綁定關系。 我們看到了我們創建的死信交換機和普通隊列。 我們可以看到我們隊列下面綁定的交換機。 我們創建一個controller包進行測試: 啟動&#xff1a; 過一段時間會變成死信隊列…

elasticsearch|大數據|elasticsearch的api部分實戰操作以及用戶和密碼的管理

一&#xff0c; 前言 本文主要內容是通過elasticsearch的api來進行一些集群的管理和信息查詢工作&#xff0c;以及elasticsearch用戶的增刪改查和密碼的重設以及重置如何操作 接上文&#xff1a;elasticsearch|大數據|elasticsearch低版本集群的部署安裝和安全增強---密碼設…

SSM與SpringBoot面試題總結

什么是spring&#xff1f;談談你對IOC和AOP的理解。 Spring:是一個企業級java應用框架&#xff0c;他的作用主要是簡化軟件的開發以及配置過程&#xff0c;簡化項目部署環境。 Spring的優點: 1、Spring低侵入設計&#xff0c;對業務代碼的污染非常低。 2、Spring的DI機制將…

FPGA設計時序約束十一、others類約束之Set_Maximum_Time_Borrow

目錄 一、序言 二、Set Maximum Time Borrow 2.1 基本概念 2.2 設置界面 2.3 命令語法 2.4 命令示例 三、參考資料 一、序言 在Vivado的時序約束窗口中&#xff0c;存在一類特殊的約束&#xff0c;劃分在others目錄下&#xff0c;可用于設置忽略或修改默認的時序路徑分析…

IntelliJ IDEA開啟git版本控制的簡單教程

這篇文章想要分享一下怎么在IntelliJ IDEA開啟版本控制&#xff0c;博主使用的是gitee&#xff0c;首先需要安裝git&#xff0c;關于git的安裝這里就不介紹了&#xff0c;很簡單。 目錄 創建git倉庫 創建項目 開啟版本控制 拉取項目 創建git倉庫 首先&#xff0c;需要登錄…

《Linux中lsof的神奇探秘:打開文件的魔法與更多相似利器》

前言 在Linux的世界里&#xff0c;lsof&#xff08;List Open Files&#xff09;是一個強大的工具&#xff0c;它能幫助我們輕松查看系統上打開的文件及網絡連接。然而&#xff0c;除了lsof之外&#xff0c;還有一些與它功能相似且同樣強大的命令等待著我們去發現。本文將引領…

MATLAB | 官方舉辦的動圖繪制大賽 | 第四周(收官周)賽情回顧

MATHWORKS官方舉辦的迷你黑客大賽第三期(MATLAB Flipbook Mini Hack)圓滿結束&#xff0c;雖然我的水平和很多大佬還有比較大的差距&#xff0c;但所有獎也算是拿滿了&#xff1a; 專家評選前三名&#xff0c;以及投票榜前十&#xff1a;~ 每周的階段性獲獎者&#xff1a; 下面…

【Python】手把手教你用tkinter設計圖書管理登錄UI界面(三)

上一篇&#xff1a;【Python】手把手教你用tkinter設計圖書管理登錄UI界面&#xff08;二&#xff09;-CSDN博客 下一篇&#xff1a; 緊接上一篇文章&#xff0c;繼續完善項目功能&#xff1a;用戶登錄。由于老王的注冊部分有億點點復雜&#xff0c;還沒完成&#xff0c;但是…

ngixn 準備

確認yum可用&#xff0c;確認防火墻&#xff0c;確認SELinux 一項安裝 yum -y install gcc make automake pcre-devel zlib zlib-devel openssl openssl-devel參數&#xff1a; gcc&#xff1a;編譯依賴gcc環境 pcre&#xff1a;PCRE(Perl Compatible Regular Expressions)是一…

鴻蒙OS應用開發的開發環境

鴻蒙OS應用開發的開發環境 鴻蒙系統發展越來越快&#xff0c;已經開始走進千家萬戶&#xff0c;從手機到電視機&#xff0c;再到汽車&#xff0c;以后各種手表、智能設備等等。這已經是一個廣泛應用的操作系統&#xff0c;也是跟大家生活密切相關的操作系統。要想在這個平臺上…

Git命令---查看遠程倉庫

介紹 使用git命令查看綁定的遠程倉庫。 命令 git remote -v

Kubernetes里的DNS;API資源對象ingress;Kubernetes調度;節點選擇器NodeSelector;節點親和性NodeAffinity

Kubernetes里的DNS K8s集群內有一個DNS服務&#xff1a; kubectl get svc -n kube-system |grep dns測試&#xff1a; 在tang3上安裝bind-utils,目的是安裝dig命令 yum install -y bind-utils apt install dnsutils #ubuntu上 解析外網域名 dig 10.15.0.10 www.baidu.com…

NSSCTF-Crypto靶場練習--第11-20題wp

文章目錄 [SWPUCTF 2021 新生賽]traditional[LitCTF 2023]夢想是紅色的 (初級)[SWPUCTF 2021 新生賽]crypto2[羊城杯 2021]Bigrsa[LitCTF 2023]Hex&#xff1f;Hex&#xff01;(初級)[SWPU 2020]happy[AFCTF 2018]BASE[安洵杯 2019]JustBase[鶴城杯 2021]Crazy_Rsa_Tech[SWPUCT…

順序表的應用

1. 順序表 1.1 寫法1 Linear_Opeartor2.c #include "stdio.h" #include "stdlib.h" #include "stdbool.h" #include "string.h" //順序表//申明順序表的大小 #define MAXSIZE 5 typedef bool status; //創建順序表 int *Linear_Creat…