c++學習-this指針

1.基本概念

非靜態成員函數都會默認傳遞this指針(靜態成員函數屬于類本身,不屬于某個實例對象),方便訪問對象對類成員變量和 成員函數。

2.基本使用

編譯器實際處理類成員函數,this是第一個隱藏的參數,類型為指向當前對象的指針

void func();             // 表面形式
void func(MyClass* this);  // 實際內部形式

編輯代碼

class MyClass {
public:int a;void show() {std::cout << a << std::endl; // 相當于 std::cout << this->a;}
};

編譯器處理

void show(MyClass* this) {std::cout << this->a << std::endl;
}

2.1區分參數和類成員變量

類成員函數中變量/函數查找順序:①當前作用域->②函數參數->③類成員變量/函數(通過this指針查找)->④父類成員->⑤編譯器報錯。

通過this指針可以區分類成員變量還是傳入參數

#include <iostream>using namespace std;class Persion {
public:void SetAge(int age) {this->age = age; // this指針指向調用成員函數的對象本身}void SetHeight(double height) {height = height; // 優先使用局部變量height,未使用this指針}void ShowAge() {cout << "Age: " << age << endl; // 使用this指針訪問成員變量}	void ShowHeight() {cout << "Height: " << height << endl; // 使用this指針訪問成員變量}int age = 0;double height = 0;
};int main() {Persion p;p.SetAge(25);p.SetHeight(175.5);p.ShowAge();    // 輸出: Age: 25p.ShowHeight(); // 輸出: Height: 0return 0;
}

ShowAge方法中,先查找函數作用域沒有age變量,通過隱藏this指針查找到類成員變量age

2.2鏈式調用

通過返回this可以實現鏈式調用

#include <iostream>using namespace std;class Persion {
public://需要使用返回Person的引用的方式,才能實現鏈式調用,否則會重新創建一個對象Persion& SetAge(int age) {this->age = age; // this指針指向調用成員函數的對象本身return *this; // 返回對象本身的引用}Persion& SetHeight(double height) {this->height = height; // 優先使用局部變量height,未使用this指針return *this; // 返回對象本身的引用}void ShowAge() {cout << "Age: " << age << endl; // 使用this指針訪問成員變量}	void ShowHeight() {cout << "Height: " << height << endl; // 使用this指針訪問成員變量}int age = 0;double height = 0;
};int main() {Persion p;p.SetAge(25).SetHeight(175.5);p.ShowAge();    // 輸出: Age: 25p.ShowHeight(); // 輸出: Height: 175.5return 0;
}

3.問題

1.非靜態類成員函數中使用的this是類成員變量還是編譯器隱式傳遞的this參數

this指針不是一個類成員變量,類成員函數中使用的this指針是編譯器隱式傳遞的this參數。(這就是為什么靜態成員函數里不能使用類成員變量和類成員函數,因為靜態成員函數沒有this指針參數,在函數內部就無法通過this指針找到對應的實例對象的成員變量以及成員函數)

#include <iostream>using namespace std;class Persion {//this指針是隱含在所有非靜態成員函數中的一個指針,指向調用該成員函數的對象,編譯器會自動傳遞this指針//this指針不是類成員變量
public://非靜態成員函數編譯器會自動傳遞this指針void setAge(int a) {this->age = a;//通過this指針訪問成員變量}//靜態成員函數編譯器不會自動傳遞this指針static void getAge() {cout << "age is " << this->age << endl;//報錯,靜態成員函數沒有this指針}int age;
};int main() {Persion p;return 0;
}

2.什么情況自動獲取this指針并傳遞給類成員函數,什么時候需要手動傳遞?

編譯器自動傳遞this指針:在非靜態成員函數內部調用類成員函數和類成員變量時(非靜態成員函數本身有隱藏this指針參數)或則通過對象直接調用非靜態成員函數時(編譯器會根據對象自動生成指向該對象的指針),this指針會被編譯器自動傳遞。

需要手動傳遞this指針:當將靜態成員函數“脫離對象上下文”傳遞(如給線程或lambda表達式,必須手動指定this。

#include <iostream>
#include <thread>using namespace std;class Persion {
public://需要使用返回Person的引用的方式,才能實現鏈式調用,否則會重新創建一個對象Persion& SetAge(int age) {this->age = age; // this指針指向調用成員函數的對象本身return *this; // 返回對象本身的引用}Persion& SetHeight(double height) {this->height = height; // 優先使用局部變量height,未使用this指針return *this; // 返回對象本身的引用}void ShowAge() {cout << "Age: " << age << endl; // 使用this指針訪問成員變量}	void ShowHeight() {cout << "Height: " << height << endl; // 使用this指針訪問成員變量}void testThisPoint() {std::thread t1(&Persion::ShowAge, this); // 傳遞this指針,必須顯示傳遞類成員函數ShowAge第一個參數thisstd::thread t2([this]() { ShowHeight(); }); // 使用lambda表達式捕獲this指針,表示式作用域內找不到ShowHeight方法,再通過this指針訪問t1.join();t2.join();std::cout << t1.joinable() << std::endl;std::cout << t2.joinable() << std::endl;}int age = 0;double height = 0;
};int main() {Persion p;p.SetAge(25).SetHeight(175.5);p.testThisPoint();return 0;
}

3.成員函數如何區分使用變量是類成員變量還是未定義變量或則傳入參數變量?this指針工作原理

層層查找,和普通變量作用域一樣,從內到外層層查找

①當前作用域->②函數參數->③類成員變量/函數(通過this指針查找)->④父類成員->⑤編譯器報錯。

4.總結

1.this指針不是一個類成員變量,類成員函數中使用的this指針是編譯器隱式傳遞的this參數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84001.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84001.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84001.shtml

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

相關文章

【Oracle】數據倉庫

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;Oracle 文章目錄 1. 數據倉庫概述1.1 為什么需要數據倉庫1.2 Oracle數據倉庫架構1.3 Oracle數據倉庫關鍵技術 2. 數據倉庫建模2.1 維度建模基礎2.2 星形模式設計2.3 雪花模式設計2.4 緩慢變化維度&#xff08;SCD&#xff09;處…

css-塞貝爾曲線

文章目錄 1、定義2、使用和解釋 1、定義 cubic-bezier() 函數定義了一個貝塞爾曲線(Cubic Bezier)語法&#xff1a;cubic-bezier(x1,y1,x2,y2) 2、使用和解釋 x1,y1,x2,y2&#xff0c;表示兩個點的坐標P1(x1,y1),P2(x2,y2)將以一條直線放在范圍只有 1 的坐標軸中&#xff0c;并…

函數式接口實現分頁查詢

你提供的 PageResult 類是一個非常完整、功能齊全的分頁結果封裝類&#xff0c;它包含了&#xff1a; 當前頁數據&#xff08;list&#xff09;總記錄數&#xff08;totalCount&#xff09;總頁數&#xff08;totalPage&#xff09;當前頁碼&#xff08;pageNo&#xff09;每頁…

Global Security Markets 第 10 章衍生品知識點總結?

一、衍生品的定義與本質 衍生品&#xff0c;作為一種金融工具&#xff0c;其價值并非獨立存在&#xff0c;而是緊密依賴于其他資產&#xff0c;如常見的股票、債券、商品&#xff0c;或者市場變量&#xff0c;像利率、匯率、股票指數等。這意味著衍生品的價格波動&#xff0c;…

DJango知識-模型類

一.項目創建 在想要將項目創鍵的目錄下,輸入cmd (進入命令提示符)在cmd中輸入:Django-admin startproject 項目名稱 (創建項目)cd 項目名稱 (進入項目)Django-admin startapp 程序名稱 (創建程序)python manage.py runserver 8080 (運行程序)將彈出的網址復制到瀏覽器中…

八股學習-JS的閉包

一.閉包的定義 閉包是指函數和其周圍的詞法環境的引用的組合。 簡單來說&#xff0c;就是函數可以記住并訪問其在定義時的作用域內的變量&#xff0c;即使該函數在其它作用域調用。 也就是說&#xff0c;閉包讓你可以在一個內層函數中訪問到其外層函數的作用域。 function …

qt使用筆記二:main.cpp詳解

Qt中main.cpp文件詳解 main.cpp是Qt應用程序的入口文件&#xff0c;包含程序的啟動邏輯。下面我將詳細解析其結構和功能。 基本結構 一個典型的Qt main.cpp 文件結構如下&#xff1a; #include <QApplication> // 或者 QGuiApplication/QCoreApplication #include &…

如何構建船舵舵角和船的航向之間的動力學方程?它是一個一階慣性環節嗎?

提問 船舵和船的航向之間的動力學方程是什么&#xff1f;是一個一階慣性環節嗎&#xff1f; 回答 船舵和船的航向&#xff08;航向角&#xff09;之間的動力學關系并不是一個簡單的一階慣性環節&#xff0c;雖然在某些簡化控制模型中可以近似為一階系統。實際上&#xff0c;…

抖去推--短視頻矩陣系統源碼開發

一、開發短視頻矩陣系統的源碼需要以下步驟&#xff1a; 確定系統需求&#xff1a; 根據客戶的具體業務目標&#xff0c;明確系統需實現的核心功能模塊&#xff0c;例如用戶注冊登錄、視頻內容上傳與管理、多維度視頻瀏覽與推薦、用戶互動&#xff08;評論、點贊、分享&#xf…

Windows 下搭建 Zephyr 開發環境

1. 系統要求 操作系統&#xff1a;Windows 10/11&#xff08;64位&#xff09;磁盤空間&#xff1a;至少 8GB 可用空間&#xff08;Zephyr 及其工具鏈較大&#xff09;權限&#xff1a;管理員權限&#xff08;部分工具需要&#xff09; 2. 安裝必要工具 winget安裝依賴工具&am…

三分算法與DeepSeek輔助證明是單峰函數

前置 單峰函數有唯一的最大值&#xff0c;最大值左側的數值嚴格單調遞增&#xff0c;最大值右側的數值嚴格單調遞減。 單谷函數有唯一的最小值&#xff0c;最小值左側的數值嚴格單調遞減&#xff0c;最小值右側的數值嚴格單調遞增。 三分的本質 三分和二分一樣都是通過不斷縮…

安全月報 | 傲盾DDoS攻擊防御2025年5月簡報

引言 在2025年5月&#xff0c;全球數字化進程高歌猛進&#xff0c;各行各業深度融入數字浪潮&#xff0c;人工智能、物聯網、大數據等前沿技術蓬勃發展&#xff0c;進一步夯實了數字經濟的基石。然而&#xff0c;在這看似繁榮的數字生態背后&#xff0c;網絡安全威脅正以驚人的…

【Spring】Spring哪些源碼解決了哪些問題P1

歡迎來到啾啾的博客&#x1f431;。 記錄學習點滴。分享工作思考和實用技巧&#xff0c;偶爾也分享一些雜談&#x1f4ac;。 有很多很多不足的地方&#xff0c;歡迎評論交流&#xff0c;感謝您的閱讀和評論&#x1f604;。 目錄 Spring是怎么處理請求的&#xff1f;Spring請求方…

堅持每日Codeforces三題挑戰:Day 4 - 題目詳解(2025-06-07,難度:1000, 1100, 1400)

前言&#xff1a; 此文章主要是記錄每天的codeforces刷題&#xff0c;還有就是給其他打算法競賽的人一點點點點小小的幫助&#xff08;畢竟現在實力比較菜&#xff0c;題目比較簡單&#xff0c;但我還是會認真寫題解&#xff09;。 之前忙學校事情&#xff0c;懈怠了一段時間…

6.7本日總結

一、英語 復習默寫list10list19&#xff0c;07年第3篇閱讀 二、數學 學習線代第一講&#xff0c;寫15講課后題 三、408 學習計組第二章&#xff0c;寫計組習題 四、總結 本周結束線代第一講和計組第二章&#xff0c;之后學習計網4.4&#xff0c;學完計網4.4之后開操作系…

PGSR : 基于平面的高斯濺射高保真表面重建【全流程分析與測試!】【2025最新版!!】

【PGSR】: 基于平面的高斯濺射高保真表面重建 前言 三維表面重建是計算機視覺和計算機圖形學領域的核心問題之一。隨著Neural Radiance Fields (NeRF)和3D Gaussian Splatting (3DGS)技術的發展&#xff0c;從多視角RGB圖像重建高質量三維表面成為了研究熱點。今天我們要深入…

從認識AI開始-----AutoEncoder:生成模型的起點

前言 從15年開始&#xff0c;在深度學習的重要模型中&#xff0c;AutoEncoder&#xff08;自編碼器&#xff09;可以說是打開生成模型世界的起點。它不僅是壓縮與重建的工具&#xff0c;更是VAE、GAN、DIffusion等復雜生成模型的思想起源。其實AutoEncoder并不復雜&#xff0c;…

解決MySQL8.4報錯ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded

最近使用了MySQL8.4 , 服務啟動成功,但是就是無法登陸,并且報錯: ERROR 1524 (HY000): Plugin mysql_native_password is not loaded 使用如下的命令也報錯 mysql -u root -p -P 3306 問題分析: 在MySQL 8.0版本中,默認的認證插件從mysql_native_password變更為cachi…

TDengine 開發指南——無模式寫入

簡介 在物聯網應用中&#xff0c;為了實現自動化管理、業務分析和設備監控等多種功能&#xff0c;通常需要采集大量的數據項。然而&#xff0c;由于應用邏輯的版本升級和設備自身的硬件調整等原因&#xff0c;數據采集項可能會頻繁發生變化。為了應對這種挑戰&#xff0c;TDen…

嵌入式面試高頻(5)!!!C++語言(嵌入式八股文,嵌入式面經)

一、C有幾種傳值方式之間的區別 一、值傳遞&#xff08;Pass by Value&#xff09; 機制&#xff1a;創建參數的副本&#xff0c;函數內操作不影響原始數據語法&#xff1a;void func(int x)特點&#xff1a; 數據安全&#xff1a;原始數據不受影響性能開銷&#xff1a;需要復…