Effective C++ 條款4:確定對象被使用前已先被初始化

Effective C++ 條款4:確定對象被使用前已先被初始化


核心思想永遠在使用對象前將其初始化。未初始化對象是未定義行為的常見來源,尤其對于內置類型。

1. 內置類型手動初始化
int x = 0;                   // 手動初始化
const char* text = "Hello";   // 指針初始化
double d;                     // ? 危險!未初始化(值隨機)

2. 類成員使用初始化列表

原因

  • 避免先默認構造再賦值的性能開銷
  • const 成員和引用成員必須用初始化列表
class PhoneNumber { /*...*/ };class ABEntry {
public:ABEntry(const std::string& name, const std::string& address, const std::list<PhoneNumber>& phones);
private:std::string theName;std::string theAddress;std::list<PhoneNumber> thePhones;int numTimesConsulted;
};// ? 正確:初始化列表(高效且安全)
ABEntry::ABEntry(const std::string& name, const std::string& address, const std::list<PhoneNumber>& phones)
: theName(name),                 // 調用string拷貝構造函數theAddress(address),           // 同上thePhones(phones),             // 調用list拷貝構造函數numTimesConsulted(0)           // 內置類型顯式初始化
{}                               // 構造函數體為空// ? 錯誤:構造函數內賦值(效率低)
ABEntry::ABEntry(...)
{ theName = name;              // 先默認構造再賦值theAddress = address;        // 額外開銷!thePhones = phones;numTimesConsulted = 0;       // 此時才"初始化"
}

3. 初始化順序規則
  • 成員初始化順序只取決于聲明順序(與初始化列表順序無關)
  • 始終按成員聲明順序寫初始化列表
class C {int a;int b;
public:// ? 危險:實際初始化順序 a(b) -> b(val)(a使用未初始化的b)C(int val) : b(val), a(b) {} // ? 正確:聲明順序=初始化順序C(int val) : a(val), b(a) {} 
};

4. 靜態對象初始化問題(跨編譯單元)

問題:不同編譯單元的全局靜態對象初始化順序不確定

// FileSystem.cpp
class FileSystem { public: int numDisks() const; };
extern FileSystem tfs;  // 全局對象// Directory.cpp
class Directory {
public:Directory() {int disks = tfs.numDisks(); // ? tfs可能尚未初始化}
};
Directory tempDir;      // 依賴tfs的全局對象

解決方案:使用局部靜態對象(Singleton模式)

// 用函數代替直接訪問全局對象
FileSystem& tfs() {static FileSystem fs;  // 首次調用時初始化return fs;
}Directory& tempDir() {static Directory td;   // 首次調用時初始化(此時tfs()已可用)return td;
}

關鍵原則總結

  1. 內置類型:必須手工初始化
  2. 類成員
    • 始終使用成員初始化列表
    • 初始化列表順序與成員聲明順序一致
  3. 靜態對象
    • 避免跨編譯單元的初始化依賴
    • 使用"局部靜態對象"模式解決初始化順序問題

重要提醒

  • 構造函數體內賦值 ≠ 初始化(效率低且不適用于所有類型)
  • 未初始化內置類型會導致隨機值(安全漏洞常見來源)
  • 靜態對象初始化順序問題可通過"首次調用時初始化"模式解決

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

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

相關文章

LangSmith的配置介紹

文章目錄注冊及登錄生成API KeyLangSmith的配置方式一&#xff1a;放運行環境里方式二&#xff1a;寫代碼里執行代碼查看LangSmith上是否看到本次運行的項目記錄LangSmith的其他注意注冊及登錄 首先使用郵箱注冊一個賬號及設置密碼&#xff0c;等收到收到郵件后&#xff0c;進…

Linux的生態與軟件安裝

堅持用 清晰易懂的圖解 代碼語言&#xff0c;讓每個知識點變得簡單&#xff01; &#x1f680;呆頭個人主頁詳情 &#x1f331; 呆頭個人Gitee代碼倉庫 &#x1f4cc; 呆頭詳細專欄系列 座右銘&#xff1a; “不患無位&#xff0c;患所以立。” Linux的生態與軟件安裝前言目錄…

3.4 安全-分布式-數據庫-挖掘

一、數據庫的安全數據庫里面的安全措施&#xff1a;用戶標識和鑒定&#xff1a;用戶的賬戶口令等存取控制&#xff1a;對用戶操作進行控權&#xff0c;有對應權限碼才能操作。密碼存儲和傳輸&#xff1a;加密存儲。視圖的保護&#xff1a;視圖需要授權審計&#xff1a;專門的文…

多線程 Reactor 模式

目錄 多線程 Reactor 模式的核心動機 多線程演進方向 多線程 Reactor 模型結構 多線程 EchoServer 實現核心部分 Handler 的多線程化 多線程 Reactor 的三個核心點 本篇文章內容的前置知識為 單線程 Reactor 模式&#xff0c;如果不了解&#xff0c;可點擊鏈接學習 單線程…

[NLP]多電源域設計的仿真驗證方法

多電源域設計的仿真驗證方法 1. 更復雜的 Testbench 例子(多電源域、復雜低功耗場景) 假設有兩個電源域 PD1 和 PD2,分別對應控制信號 pwr_sw_ctrl1、iso_ctrl1、ret_ctrl1 和 pwr_sw_ctrl2、iso_ctrl2、ret_ctrl2,且兩域之間有通信。 RTL 端口聲明(簡化版) module top…

Apache Ignite 中 WHERE 子句中的子查詢(Subqueries in WHERE Clause)的執行方式

這段內容是關于 Apache Ignite 中 WHERE 子句中的子查詢&#xff08;Subqueries in WHERE Clause&#xff09;的執行方式 的說明。理解這段內容對于編寫高效的 SQL 查詢、避免性能瓶頸非常重要。下面我將為你 逐句解釋并深入理解這段內容。&#x1f9fe; 原文翻譯 解釋 原文&a…

MySQL(153)如何使用全文索引?

MySQL的全文索引&#xff08;Full-Text Index&#xff09;是一種特殊的索引類型&#xff0c;專門用于加速文本數據的搜索。與普通的B樹索引不同&#xff0c;全文索引適用于大文本字段&#xff08;如TEXT、VARCHAR等&#xff09;的全文搜索。它通過構建一個倒排索引&#xff0c;…

微分方程入門之入門之入門,純筆記

當描述 相對變化量 比 絕對量 更容易時&#xff0c;微分方程就經常用到了。 比如&#xff0c;描述為什么種群數量增加or減少【相對】&#xff0c;比描述為什么它在某個時間點是某個特定值【絕對】更容易。 物理學中&#xff0c;運動經常用力來描述&#xff0c;力–>代表變化…

【C++】簡單學——vector類(模擬實現)

模擬實現的準備工作 看源碼&#xff0c;了解這個類的大概組成 1.先看成員變量 成員變量的組成是三個迭代器 問&#xff1a;這個iterator內嵌類型究竟是什么&#xff1f;即這個迭代器是什么 迭代器實際就是T* 問&#xff1a;這三個迭代器代表什么意思&#xff1f; 連蒙帶猜…

【WRF】根據自動安裝腳本安裝 WRF / WRF-CHEM等

目錄 GitHub 上 WRF 自動安裝腳本 ?? 腳本的作用 ??? 支持的系統 ?? 可安裝的 WRF 版本及其選項 ? 如何使用(以 WRF 4.6.1 為例) ? 依賴庫的安裝位置 完整安裝腳本分析 參考 GitHub 上 WRF 自動安裝腳本 GitHub 上的 WRF-Install-Script 項目的 Releases(發布版本…

M2IV:面向大型視覺-語言模型中高效且細粒度的多模態上下文學習

MIV&#xff1a; Towards Efficient and Fine-grained Multimodal In Context Learning in Large Vision-Language Models COLM 2025 why 新興的研究方向&#xff1a;上下文學習&#xff08;ICL&#xff09;的效果“向量化”&#xff0c;其核心思想是用transformer內部的向量來…

龍迅#LT8711UXD適用于Type-C/DP1.4 /EDP轉 HDMI2.0 功能,分辨率高達4K60HZ,可支持HDCP!

1. 描述LT8711UXD 是一款高性能雙通道 Type-C/DP1.4 轉 HDMI2.0 轉換器&#xff0c;旨在將 USB Type-C 源或 DP1.4 源連接到 HDMI2.0 接收器。該LT8711UXD集成了一個符合 DP1.4 標準的接收器和一個符合 HDMI2.0 標準的發射器。此外&#xff0c;還嵌入了兩個用于CC通信的CC控制器…

《計算機組成原理與匯編語言程序設計》實驗報告一 基本數字邏輯及漢字顯示

目 錄 一、實驗學時 二、實驗目的 三、實驗要求 四、實驗內容 五、實驗步驟 1、打開Logisim軟件&#xff0c;列出異或邏輯電路真值表&#xff0c;并使用與、或、非基本原件實現異或邏輯電路。 2、打開Logisim軟件&#xff0c;列出同或邏輯電路真值表&#xff0c;并使用…

聚焦牛牛道:綠色積分模式如何實現快速發展?

?綠色消費積分政策再次進入大眾視野&#xff0c;這種能為企業減輕庫存負擔、讓咨金周轉更靈活的促銷方式&#xff0c;很快就成了焦點。牛牛道作為積極踐行這一政策的平臺&#xff0c;憑借其獨樹一幟的商業模式和運營思路&#xff0c;在短時間內就取得了顯著發展。一、牛牛道平…

高頻 RFID 賦能工業教學設備教學應用

高頻 RFID 賦能工業教學設備教學應用應用背景傳統工業教學設備側重機械原理、電氣控制等基礎功能演示&#xff0c;缺乏對 RFID 等工業識別技術的具象教學載體。學生在理論學習中難以直觀理解 RFID 技術的工業適配邏輯&#xff0c;實訓中缺乏設備識別系統的部署、調試經驗&#…

Transformer:顛覆NLP的自注意力革命

Transformer:顛覆NLP的自注意力革命 Transformer是自然語言處理領域中極具影響力的深度學習模型架構,以下是對其的詳細介紹: 提出背景與應用:2017年,Vaswani等人在《Attention Is All You Need》論文中首次提出Transformer架構,它主要用于處理序列到序列的任務,如機器翻…

基于 KeepAlived + HAProxy 搭建 RabbitMQ 高可用負載均衡集群

基于 KeepAlived HAProxy 搭建 RabbitMQ 高可用負載均衡集群 基于 KeepAlived HAProxy 搭建 RabbitMQ 高可用負載均衡集群實戰指南 一、前言 在企業級應用中&#xff0c;消息隊列的高可用性是系統穩定性的重要保障。RabbitMQ 作為主流的消息中間件&#xff0c;雖然自身支持…

京東獲得JD商品詳情 API 返回值說明||京東API接入文檔

京東商品詳情API返回值核心字段說明一、商品基礎信息商品ID&#xff08;skuId/productId&#xff09;唯一標識符&#xff0c;用于定位具體商品或SKU&#xff08;如不同顏色、尺寸的變體&#xff09;。示例&#xff1a;"skuId": "123456789"商品標題&#x…

其他世界的自來水

西歐&#xff0c;北美&#xff0c;亞洲日韓等地區&#xff0c;他們的自來水可以直接飲用以英國為例&#xff1a;自來水的質量可能等同或者有可能超過純凈水&#xff0c;不需要消毒和過濾直接可以飲用。直接從水龍接的水和瓶裝純凈水沒有什么差別&#xff0c;甚至比瓶裝純凈水更…

IO密集型、CPU密集型、負載、負載均衡

0、引入 從宏觀上來講&#xff0c;計算機可以抽象為【輸入 > 計算 > 輸出】這三部分 輸入輸出自然就是io&#xff0c;而計算部分自然歸cpu管 不同的任務&#xff0c;對io和cpu的依賴程度不同&#xff0c;由此有了cpu密集型任務和io密集型任務 1、IO密集型 更依賴輸入…