C++——this關鍵字和new關鍵字

一、this?關鍵字

1. 什么是?this

this?是 C++ 中的一個隱式指針,它指向當前對象(即調用成員函數的對象),在成員函數內部使用,用于引用調用該函數的對象。每個類的非靜態成員函數內部都可以使用?this

使用 this 可以明確指出成員函數正在操作的是哪個對象的數據成員。

2. 為什么需要?this

當成員函數的參數名與成員變量名相同時,可以用?this?來區分。

示例代碼:
#include <iostream>
using namespace std;class Person {
private:string name;int age;public:// 構造函數,參數名與成員變量名相同Person(string name, int age) {this->name = name;  // 用 this 區分成員變量和參數this->age = age;}void printInfo() {// this 可以省略,但顯式使用更清晰cout << "Name: " << this->name << ", Age: " << this->age << endl;}// 返回當前對象的引用(用于鏈式調用)Person& setName(string name) {this->name = name;return *this;  // 返回當前對象本身}
};int main() {Person p("Alice", 25);p.printInfo();  // 輸出: Name: Alice, Age: 25// 鏈式調用p.setName("Bob").printInfo();  // 輸出: Name: Bob, Age: 25return 0;
}
代碼解釋:
  1. 在構造函數中,參數名?name?和?age?與成員變量同名,用?this->name?表示成員變量。
  2. printInfo()?中?this?可以省略,但顯式使用讓代碼更清晰。
  3. setName()?返回?*this(即當前對象的引用),支持鏈式調用。

3.?this?的其他用途

  • 傳遞當前對象給其他函數
  • 在成員函數中返回當前對象本身
  • 解決局部變量與成員變量同名的問題
示例:
class Example {int value;
public:Example(int value) {this->value = value;  // 區分成員變量和參數}void show() {cout << "Value: " << value << endl;  // 等價于 this->value}Example& increment() {this->value++;  // 修改當前對象的成員return *this;   // 返回當前對象本身}
};

4.?this?的注意事項

  • this?是指針,不是引用(*this?才是當前對象的引用)
  • 靜態成員函數中沒有?this(因為靜態函數不屬于任何對象)
  • 不要隨意返回?this?的指針(可能導致懸空指針)

二、new?關鍵字

1. 什么是?new

new?是 C++ 中用于動態內存分配的運算符,它在堆(heap)上創建對象并返回指針。

2. 為什么需要?new

  • 在程序運行時(而非編譯時)決定內存分配
  • 創建的對象生命周期不受作用域限制
  • 可以創建大型對象(棧空間可能不足)

3. 基本用法

示例代碼:
#include <iostream>
using namespace std;class Dog {string name;int age;
public:Dog(string n, int a) : name(n), age(a) {}void bark() {cout << name << " says: Woof! I'm " << age << " years old." << endl;}~Dog() {cout << name << " is being destroyed." << endl;}
};int main() {// 在堆上創建 Dog 對象Dog* myDog = new Dog("Buddy", 3);myDog->bark();  // 輸出: Buddy says: Woof! I'm 3 years old.// 必須手動釋放內存delete myDog;  // 輸出: Buddy is being destroyed.return 0;
}
代碼解釋:
  1. new Dog("Buddy", 3)?在堆上創建對象,返回指向它的指針。
  2. 通過指針訪問成員用?->?運算符。
  3. delete?釋放內存并調用析構函數。

4.?new?的高級用法

動態數組分配:
int main() {// 動態分配包含 5 個 int 的數組int* arr = new int[5];for (int i = 0; i < 5; i++) {arr[i] = i * 10;  // 賦值}for (int i = 0; i < 5; i++) {cout << arr[i] << " ";  // 輸出: 0 10 20 30 40}cout << endl;// 釋放數組要用 delete[]delete[] arr;return 0;
}
注意事項:
  • 數組必須用?delete[]?釋放,單個對象用?delete
  • 忘記釋放會導致內存泄漏。

5.?new?的替代方案(現代 C++)

使用智能指針(推薦):
#include <memory>int main() {// 自動管理內存的 unique_ptrunique_ptr<Dog> smartDog(new Dog("Max", 4));smartDog->bark();// 不需要手動 delete,離開作用域自動釋放// 更安全的 make_unique (C++14)auto smartDog2 = make_unique<Dog>("Charlie", 5);smartDog2->bark();return 0;
}

6.?new?的注意事項

  • 必須配對使用?delete

int* p = new int;  // 分配
*p = 10;
delete p;         // 釋放
  • 避免內存泄漏
void leakyFunction() {int* leak = new int[100];  // 分配但未釋放// 如果中間發生異常,delete 永遠不會執行
}  // 內存泄漏!
  • 不要重復釋放
int* p = new int;
delete p;  // 正確
delete p;  // 錯誤!未定義行為
  • 檢查分配是否成功(現代 C++ 中?new?失敗會拋出?std::bad_alloc?異常)

  • 初始化分配的內存

// C++11 統一初始化
int* p1 = new int{42};  // 值初始化為 42// 默認初始化(值不確定)
int* p2 = new int;// 動態數組初始化為 0
int* arr = new int[10]();  // 所有元素初始化為 0

三、總結對比

特性this?關鍵字new?運算符
作用指向當前對象動態分配內存
返回值當前對象的指針新分配內存的指針
使用場景成員函數中訪問當前對象需要運行時決定內存分配時
內存位置不適用(是指針)堆(heap)
生命周期不適用直到顯式?delete?或程序結束
錯誤風險誤用可能導致邏輯錯誤忘記釋放導致內存泄漏

最佳實踐建議:

  1. this?使用建議
    • 在成員變量和參數同名時使用
    • 需要返回當前對象時(鏈式調用)
    • 避免過度使用,保持代碼清晰
  2. new?使用建議
    • 優先考慮棧分配或智能指針
    • 如果必須用?new,確保有對應的?delete
    • 對于數組,使用?std::vector?代替?new[]
    • 在 C++11+ 中,優先使用?std::make_unique/std::make_shared
  3. 現代 C++ 趨勢
    • 減少裸?new/delete?的使用
    • 使用 RAII(資源獲取即初始化)原則
    • 依賴標準庫容器和智能指針管理資源

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

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

相關文章

Python中類靜態方法:@classmethod/@staticmethod詳解和實戰示例

在 Python 中&#xff0c;類方法 (classmethod) 和靜態方法 (staticmethod) 是類作用域下的兩種特殊方法。它們使用裝飾器定義&#xff0c;并且與實例方法 (def func(self)) 的行為有所不同。1. 三種方法的對比概覽方法類型是否訪問實例 (self)是否訪問類 (cls)典型用途實例方法…

FastGPT革命:下一代語言模型的極速進化

本文深度解析FastGPT核心技術架構&#xff0c;涵蓋分布式推理、量化壓縮、硬件加速等前沿方案&#xff0c;包含完整落地實踐指南&#xff0c;助你掌握大模型高效部署的終極武器。引言&#xff1a;當大模型遭遇速度瓶頸2023年&#xff0c;ChatGPT引爆全球AI熱潮&#xff0c;但企…

Geant4 安裝---Ubuntu

安裝工具 C/C工具包 sudo apt install build-essentialCmake sudo apt install -y cmakeccmake sudo apt install -y cmake-curses-gui安裝Qt可視化工具(不需要可視化可以不安裝) sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator 安裝Ope…

Spring Boot中請求參數讀取方式

目錄 一、前言 二、六種參數讀取方式 1.RequestParam 2.PathVariable 3.RequestBody 4.RequestHeader 5.CookieValue 6.MatrixVariable 三、對比和搭配 1.適用方法類型及建議使用場景 2.建議使用的請求路徑注解 3. 多種參數同時使用 4.同一請求不同方案&#xff1f…

2025華為OD機試真題最新題庫 (B+C+D+E+2025A+2025B卷) + 在線OJ在線刷題使用(C++、Java、Python C語言 JS合集)(正在更新2025B卷,目前已收錄710道)

2025年&#xff0c;已經開始使用AB卷題庫&#xff0c;題目和往期一樣&#xff0c;舊題加新題的組合&#xff0c;有題目第一時間更新&#xff0c;大家可以跟著繼續學習&#xff0c;目前使用復用題較多&#xff0c;可在OJ上直接找到對應的AB卷學習&#xff0c;可以放心學習&#…

分析新舊因子相關性

計算一組新因子、并分析它們與已有因子間的相關性1. 導入庫和初始化環境功能代碼解析數據加載2. 定義新因子計算函數功能代碼解析因子 1&#xff1a;波動率過濾器&#xff08;filter_001_1&#xff09;因子 2&#xff1a;ATR 過濾器&#xff08;filter_001_2&#xff09;因子 3…

Unity Demo——3D平臺跳躍游戲筆記

今天是一個3D平臺跳躍游戲的筆記。我們按照以下分類來對這個項目的代碼進行學習&#xff1a;核心游戲系統 (Core Game Systems)核心游戲系統是IkunOdyssey項目的基礎&#xff0c;負責所有游戲對象&#xff08;如玩家、敵人、道具等&#xff09;的通用行為和物理交互。它通過實體…

【C語言】回調函數、轉移表、qsort 使用與基于qsort改造冒泡排序

文章目錄數組指針/指針數組函數指針函數指針數組函數指針數組用途(轉移表)回調函數qsort函數基于qsort改造冒泡排序源碼數組指針/指針數組 int arr1[5] { 1,2,3,4,5 };int (*p1)[5] &arr1; //p1是數組指針變量int* arr2[5] { 0 }; //arr2是指針數組指針數組是存放指…

vue3 uniapp 使用ref更新值后子組件沒有更新 ref reactive的區別?使用from from -item執行表單驗證一直提示沒有值

遇到這樣一個問題&#xff0c;我有個1個頁面A&#xff0c;一個from表單組件&#xff0c;一個form-item組件&#xff0c; 使用是這樣的&#xff0c;我在父組件A中使用 &#xff0c;執行表單驗證一直提示沒有值咱們先來講一講ref 和reactive的區別 ref 用來創建一個基本類型或單…

PyQt5布局管理(QBoxLayout(框布局))

QBoxLayout&#xff08;框布局&#xff09; 采用QBoxLayout類可以在水平和垂直方向上排列控件&#xff0c;QHBoxLayout和 QVBoxLayout類繼承自QBoxLayout類。 QHBoxLayout&#xff08;水平布局&#xff09; 采用QHBoxLayout類&#xff0c;按照從左到右的順序來添加控件。QHBoxL…

Grok 4作戰圖刷爆全網,80%華人橫掃硅谷!清華上交校友領銜,95后站C位

來源 | 新智元短短兩年&#xff0c;馬斯克Grok 4的橫空出世&#xff0c;讓xAI團隊一舉站上AI之巔。昨日一小時發布會&#xff0c;Grok 4讓所有人大開眼界&#xff0c;直接刷爆了AIME 2025、人類最后的考試&#xff08;HLE&#xff09;兩大基準。這是狂堆20萬GPU才換來的驚人成果…

AI大模型(七)Langchain核心模塊與實戰(二)

Langchain核心模塊與實戰&#xff08;二&#xff09;Langchian向量數據庫檢索Langchian構建向量數據庫和檢索器批量搜索返回與之相似度最高的第一個檢索器和模型結合得到非籠統的答案LangChain構建代理通過代理去調用Langchain構建RAG的對話應用包含歷史記錄的對話生成Langchia…

Flutter基礎(前端教程①-容器和控件位置)

一個紅色背景的 Container垂直排列的 Column 布局中央的 ElevatedButton按鈕下方的白色文本import package:flutter/material.dart;void main() {runApp(const MyApp()); }class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);overrideWidget bu…

CSS flex

目錄 flex-box和flex-item 主軸和副軸 ?編輯 flex-box的屬性 flex-direction flex-wrap flex-flow justify-content ?編輯?align-items align-content flex-item的屬性 flex-basis flex-grow flex-shrink flex flex-box和flex-item 當把一個塊級元素的displ…

【JMeter】執行系統命令

步驟如下&#xff1a; 添加JSP233 Sampler&#xff1a;右擊線程組>添加>取樣器>JSR223 Sampler2.填寫腳本&#xff0c;執行后查看日志。res "ipconfig".execute().text log.info(res)res "python -c \"print(11)\"".execute().text l…

AI Agent開發學習系列 - langchain之memory(1):內存中的短時記憶

內存中的短時記憶&#xff0c;在 LangChain 中通常指 ConversationBufferMemory 這類“對話緩沖記憶”工具。它的作用是&#xff1a;在內存中保存最近的對話歷史&#xff0c;讓大模型能理解上下文&#xff0c;實現連續對話。 對話緩沖記憶”工具 主要特點 只保留最近的對話內容…

uniapp實現微信小程序端圖片保存到相冊

效果圖展示 安裝插件海報畫板導入到項目里面&#xff0c;在頁面直接使用 <template><view><button click"saveToAlbum" class"save-button">保存到相冊</button><image :src"path" mode"widthFix" v-if&qu…

Java生產帶文字、帶邊框的二維碼

Java 生成帶文字、帶邊框的二維碼1、Java 生成帶文字的二維碼1.1、導入jar包1.2、普通單一的二維碼1.2.1、代碼示例1.2.2、效果1.3、帶文字的二維碼1.&#xff13;.&#xff11;、代碼示例1.3.2、效果2、帶邊框的二維碼2.1、代碼示例2.2、帶邊框的二維碼效果 1、Java 生成帶文字…

ARM單片機啟動流程(三)(棧空間綜合理解及相關實際應用)

文章目錄1、引出棧空間問題2、解決問題2.1、RAM空間2.2、RAM空間具體分布2.3、關于棧空間的使用2.4、棧溢出2.5、變量的消亡2.6、回到關鍵字static2.7、合法性的判斷1、引出棧空間問題 從static關鍵字引出該部分內容。 為什么能從static引出來&#xff1f; 在使用該關鍵字的…

【RK3568+PG2L50H開發板實驗例程】FPGA部分 | 鍵控LED實驗

本原創文章由深圳市小眼睛科技有限公司創作&#xff0c;版權歸本公司所有&#xff0c;如需轉載&#xff0c;需授權并注明出處&#xff08;www.meyesemi.com) 1.實驗簡介 實驗目的&#xff1a; 從創建工程到編寫代碼&#xff0c;完成引腳約束&#xff0c;最后生成 bit 流下載到…