C++默認構造函數、普通構造函數、拷貝構造、移動構造、委托構造及析構函數深度解析

目錄

        • 一、默認構造函數(Default Constructor)
        • 二、普通構造函數(General Constructor)
        • 三、拷貝構造函數(Copy Constructor)
        • 四、移動構造函數(Move Constructor,C++11)
        • 五、委托構造函數(Delegating Constructor,C++11)
        • 六、析構函數(Destructor)
        • 七、綜合示例:完整類設計
        • 八、總結對比
        • 九、最佳實踐

C++中的構造函數和析構函數是面向對象編程的核心機制,它們管理對象的生命周期和資源。本文結合C++11及后續標準,深入解析默認構造函數、普通構造函數、拷貝構造函數、移動構造函數、委托構造函數及析構函數的核心特性和應用場景。

一、默認構造函數(Default Constructor)

定義:沒有參數或所有參數均有默認值的構造函數。若未顯式定義任何構造函數,編譯器會自動生成一個空實現的默認構造函數。
特點:

  • 用于初始化對象默認狀態
  • 自動生成的條件:類中無任何構造函數時
  • 可手動禁用或顯式聲明(= default或= delete)
    示例:
class MyClass {
public:MyClass() = default; // 顯式聲明默認構造函數MyClass(int x = 0) : value(x) {} // 帶默認參數的構造函數
private:int value;
};

注意事項:

  • 若存在其他構造函數,編譯器不再自動生成默認構造函數
  • 對于含有內置類型成員的對象,默認構造函數不會初始化成員變量(可能產生隨機值)
二、普通構造函數(General Constructor)

定義:帶參數的構造函數,用于初始化對象的特定狀態。支持重載,可通過不同參數組合創建對象。
特點:

  • 通過初始化列表高效初始化成員變量
  • 支持多態初始化,例如std::string(“Hello”)
    示例:
class Student {
public:Student(int id, const string& name) : m_id(id), m_name(name) {} // 初始化列表
private:int m_id;string m_name;
};

應用場景:

  • 需要明確初始化邏輯時(如數據庫連接需指定IP和端口)
  • 避免成員變量未初始化導致的未定義行為
三、拷貝構造函數(Copy Constructor)

定義:通過已有對象初始化新對象,形式為ClassName(const ClassName& other)。默認實現為淺拷貝,需手動處理指針成員。
調用時機:

  1. 對象作為函數參數傳遞(值傳遞)
  2. 函數返回對象時
  3. 顯式拷貝初始化(MyClass obj2 = obj1;)
    深淺拷貝對比:
// 淺拷貝(默認危險行為)
class ShallowCopy {
public:int* data;ShallowCopy(int val) { data = new int(val); }~ShallowCopy() { delete data; } // 潛在雙重釋放
};// 深拷貝(安全實現)
class DeepCopy {
public:int* data;DeepCopy(const DeepCopy& other) {data = new int(*other.data); // 重新分配內存}
};
四、移動構造函數(Move Constructor,C++11)

定義:通過右值引用(&&)轉移資源所有權,避免不必要的拷貝開銷。
核心機制:

  • 竊取臨時對象或即將銷毀對象的資源
  • 將原對象指針置空避免重復釋放
  • 需標記為noexcept以支持STL容器優化
    示例:
class String {
public:// 移動構造函數String(String&& other) noexcept : data(other.data), size(other.size) {other.data = nullptr; // 轉移后置空原指針}
private:char* data;size_t size;
};

性能優勢:

  • 減少動態內存分配次數
  • 在vector::push_back等操作中避免深拷貝
五、委托構造函數(Delegating Constructor,C++11)

定義:通過初始化列表調用同類其他構造函數,減少代碼冗余。
規則:

  • 必須通過初始化列表委托
  • 禁止循環委托(如A委托B,B又委托A)
  • 可結合參數默認值實現靈活初始化
    示例:
class Rectangle {
public:// 主構造函數Rectangle(int w, int h) : width(w), height(h) {}// 委托構造:正方形初始化Rectangle(int size) : Rectangle(size, size) {}// 委托構造:默認初始化Rectangle() : Rectangle(0, 0) {}
};
六、析構函數(Destructor)

定義:對象生命周期結束時自動調用,用于釋放資源,形式為~ClassName()。
關鍵特性:

  • 不可重載(每個類唯一)
  • 虛析構函數支持多態刪除(virtual ~Base())
  • 默認析構函數不處理動態內存
    資源管理示例:
class FileHandler {
public:FileHandler(const string& path) { file = fopen(path.c_str(), "r"); }~FileHandler() { if(file) fclose(file); // 確保資源釋放}
private:FILE* file;
};

注意事項:

  • 含有指針成員的類必須自定義析構函數
  • 析構順序:派生類→成員對象→基類
七、綜合示例:完整類設計
class AdvancedClass {
public:// 默認構造AdvancedClass() : data(nullptr), size(0) {}// 普通構造AdvancedClass(int s) : size(s), data(new int[s]{}) {}// 拷貝構造(深拷貝)AdvancedClass(const AdvancedClass& other) : size(other.size), data(new int[other.size]) {std::copy(other.data, other.data + size, data);}// 移動構造AdvancedClass(AdvancedClass&& other) noexcept : data(other.data), size(other.size) {other.data = nullptr;}// 委托構造AdvancedClass(int a, int b) : AdvancedClass(2) {data[0] = a; data[1] = b;}// 析構函數~AdvancedClass() { delete[] data; }private:int* data;int size;
};
八、總結對比
函數類型語法特征核心作用性能影響
默認構造函數ClassName()基礎初始化
普通構造函數帶參數定制化初始化
拷貝構造函數const ClassName&對象復制(深/淺拷貝)可能高(深拷貝)
移動構造函數ClassName&&資源轉移
委托構造函數構造器鏈式調用代碼復用
析構函數~ClassName()資源釋放關鍵
九、最佳實踐
  1. Rule of Five:若自定義拷貝構造/賦值、移動構造/賦值、析構函數中的任意一個,建議顯式定義全部五個。
  2. RAII原則:通過構造函數獲取資源,析構函數釋放資源。
  3. 移動語義優先:對臨時對象使用std::move觸發移動語義。
  4. 委托構造優化:減少重復初始化代碼。

通過合理運用這些特性,可構建高效、安全的C++對象模型,尤其在資源管理、高性能計算等場景中體現關鍵價值。

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

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

相關文章

JVM 深度解析

一、JVM 概述 1.1 什么是 JVM? JVM(Java Virtual Machine,Java 虛擬機)是 Java 程序運行的核心引擎。它像一個“翻譯官”,將 Java 字節碼轉換為機器能理解的指令,并管理程序運行時的內存、線程等資源。 …

OpenCV CUDA 模塊圖像過濾-----創建一個計算圖像導數的濾波器函數createDerivFilter()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 cv::cuda::createDerivFilter 是 OpenCV CUDA 模塊中的一個工廠函數,用于創建一個計算圖像導數的濾波器。這個濾波器可以用來計算圖像…

Spring Boot 接口開發實戰指南

Spring Boot 接口開發實戰指南 一、基礎接口開發步驟 1.1 添加必要依賴 <!-- pom.xml --> <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></depen…

題目 3325: 藍橋杯2025年第十六屆省賽真題-2025 圖形

題目 3325: 藍橋杯2025年第十六屆省賽真題-2025 圖形 時間限制: 2s 內存限制: 192MB 提交: 494 解決: 206 題目描述 小藍要畫一個 2025 圖形。圖形的形狀為一個 h w 的矩形&#xff0c;其中 h 表示圖形的高&#xff0c;w 表示圖形的寬。當 h 5,w 10 時&#xff0c;圖形如下所…

UML 時序圖 使用案例

UML 時序圖 UML 時序圖 (Sequence Diagram)時序圖的主要元素消息類型詳解時序圖示例時序圖繪制步驟時序圖的應用場景 UML 時序圖 (Sequence Diagram) 時序圖是UML(統一建模語言)中用于展示對象之間交互行為的動態視圖&#xff0c;它特別強調消息的時間順序。 時序圖的主要元素…

PPT連同備注頁(演講者模式)一塊轉為PDF

首先&#xff0c;進入創建PDF/XPS&#xff1a; 然后進入選項&#xff1a; 發布選項-發布內容里選備注頁&#xff1a; 導出的原始結果是這樣的&#xff1a; 這個時候裁剪一下&#xff0c;范圍為所有頁面&#xff1a; 最終結果&#xff1a; 如果導出不選“備注頁”而是只勾選“包…

AI時代新詞-多模態(Multimodal)

一、什么是多模態&#xff08;Multimodal&#xff09;&#xff1f; 多模態&#xff08;Multimodal&#xff09;是指在人工智能中&#xff0c;融合多種不同類型的信息&#xff08;如文本、圖像、語音、視頻等&#xff09;進行處理和分析的技術。與傳統的單一模態&#xff08;例…

【圖像大模型】Stable Diffusion XL:下一代文本到圖像生成模型的技術突破與實踐指南

Stable Diffusion XL&#xff1a;下一代文本到圖像生成模型的技術突破與實踐指南 一、架構設計與技術演進1.1 核心架構革新1.2 關鍵技術突破1.2.1 雙文本編碼器融合1.2.2 動態擴散調度 二、系統架構解析2.1 完整生成流程2.2 性能指標對比 三、實戰部署指南3.1 環境配置3.2 基礎…

圖像分割技術的實現與比較分析

引言 圖像分割是計算機視覺領域中的一項基礎技術&#xff0c;其目標是將數字圖像劃分為多個圖像子區域&#xff08;像素的集合&#xff09;&#xff0c;以簡化圖像表示&#xff0c;便于后續分析和理解。在醫學影像、遙感圖像分析、自動駕駛、工業檢測等眾多領域&#xff0c;圖…

摩爾線程S4000國產信創計算卡性能實戰——Pytorch轉譯,多卡P2P通信與MUSA編程

簡介 MTT S4000 是基于摩爾線程曲院 GPU 架構打造的全功能元計算卡&#xff0c;為千億規模大語言模型的訓練、微調和推理進行了定制優化&#xff0c;結合先進的圖形渲染能力、視頻編解碼能力和超高清 8K HDR 顯示能力&#xff0c;助力人工智能、圖形渲染、多媒體、科學計算與物…

「從0到1」構建工業物聯網監控系統:ARM+Quarkus+Prometheus技術棧全記錄

在工業4.0浪潮中&#xff0c;邊緣計算正成為智能制造的核心基礎設施。ARM架構邊緣計算機憑借其低功耗、高能效比和模塊化設計優勢&#xff0c;正在重塑工業物聯網&#xff08;IIoT&#xff09;的監控體系。當Java的跨平臺能力與Prometheus的實時監控體系相結合&#xff0c;為工…

【HW系列】—web常規漏洞(文件上傳漏洞)

文章目錄 一、簡介二、危害三、文件檢測方式分類四、判斷文件檢測方式五、文件上傳繞過技術六、漏洞防御措施 一、簡介 文件上傳漏洞是指Web應用程序在處理用戶上傳文件時&#xff0c;未對文件類型、內容、路徑等進行嚴格校驗和限制&#xff0c;導致攻擊者可上傳惡意文件&…

如何設計ES的冷熱數據分離架構?Elasticsearch 集群如何實現高可用?如何避免腦裂問題?如果出現腦裂如何恢復?

以下為Elasticsearch架構設計與高可用方案詳細說明&#xff1a; 冷熱架構 一、冷熱數據分離架構設計&#xff08;文字描述模擬架構圖&#xff09; [Hot Layer] │ ├─ SSD節點組&#xff08;3節點&#xff09; │ ├─ 角色&#xff1a;ingest/data/hot │ ├─ 存…

Trivy 鏡像漏洞掃描:從零入門到實戰指南

&#x1f525;「炎碼工坊」技術彈藥已裝填&#xff01; 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 ——手把手帶你掌握容器安全核心工具 一、安裝配置&#xff1a;三步完成 Trivy 部署 Trivy 是由 Aqua Security 開發的開源容器安全工具&#xff0c;支持…

SQL基礎概念以及SQL的執行方式

1. SQL入門 1.1. SQL語言功能 可以把 SQL 語言按照功能劃分成以下的 4 個部分&#xff1a; DDL&#xff0c;英文叫做 Data Definition Language&#xff0c;也就是數據定義語言&#xff0c;它用來定義我們的數據庫對象&#xff0c;包括數據庫、數據表和列。通過使用 DDL&…

Rust 1.0 發布十周年,夢想再度揚帆起航!

目錄 引言&#xff1a;發布十周年&#xff0c;鋒芒露今朝 一、Rust的誕生&#xff1a;源于安全的初心 二、Rust 1.0&#xff1a;十年耕耘&#xff0c;碩果累累 三、核心利器&#xff1a;安全、并發與性能的十年錘煉 四、生態與應用&#xff1a;十年拓展&#xff0c;遍地開…

x86 與 ARM 匯編深度對比:聚焦 x86 匯編的獨特魅力

一、引言 匯編語言是硬件與軟件的橋梁&#xff0c;x86 和 ARM 作為兩大主流架構&#xff0c;其匯編語言在設計理念、指令集、編程風格上差異顯著。本文以 x86 匯編為核心&#xff0c;結合與 ARM 的對比&#xff0c;解析 x86 匯編的技術細節與應用場景&#xff0c;助力開發者深…

入駐面包多了

前言 入駐面包多了&#xff0c;其實已經開通面包多賬號老久了&#xff0c;一直沒有認證&#xff0c;因為沒什么拿得出手的作品。 后邊會努力沉淀&#xff0c;希望能出一些作品&#xff0c;給大家帶來一些幫助&#xff0c;然后能賺到一些些奶茶錢。 一個小工具 上架了一個Win…

Python----目標檢測(MS COCO數據集)

一、MS COCO數據集 COCO 是一個大規模的對象檢測、分割和圖像描述數據集。COCO有幾個 特點&#xff1a; Object segmentation&#xff1a;目標級的分割&#xff08;實例分割&#xff09; Recognition in context&#xff1a;上下文中的識別&#xff08;圖像情景識別&#xff0…

【Spring AI集成實戰】基于NVIDIA LLM API構建智能聊天應用:從配置到函數調用全解析

【Spring AI集成實戰】基于NVIDIA LLM API構建智能聊天應用&#xff1a;從配置到函數調用全解析 前言 在人工智能應用開發領域&#xff0c;大語言模型&#xff08;LLM&#xff09;的集成能力至關重要。NVIDIA作為全球領先的GPU廠商&#xff0c;其LLM API提供了對Meta Llama-3.…