Effective C++ 條款19: 設計class猶如設計type

Effective C++ 條款19:設計class猶如設計type


核心思想設計新的class時,應當像語言設計者設計內置類型一樣慎重,考慮對象的創建、銷毀、初始化、拷貝、類型轉換等所有方面。

?? 1. 類設計的關鍵問題域

對象生命周期管理

class ResourceHandle {
public:// 構造和析構:資源如何獲取?如何釋放?ResourceHandle(const std::string& resId);~ResourceHandle();  // 需要釋放資源嗎?private:Resource* resource_;
};

值語義與行為

class Rational {
public:// 拷貝操作:允許拷貝嗎?淺拷貝還是深拷貝?Rational(const Rational& other);Rational& operator=(const Rational& other);// 類型轉換:支持隱式轉換嗎?operator double() const;  // 危險:可能非預期轉換
};

🚨 2. 解決方案:系統化設計方法

明確對象創建方式

class Session {
public:// 靜態工廠方法:控制創建邏輯static Session createFromNetwork();static Session createFromFile(const std::string& path);// 禁用拷貝Session(const Session&) = delete;Session& operator=(const Session&) = delete;
private:Session();  // 私有構造
};

安全類型轉換接口

class SafeRational {
public:// 顯式轉換函數(C++11)explicit operator double() const { return static_cast<double>(numerator)/denominator; }// 轉換運算符替代方案double toDouble() const { /* ... */ }  // 更安全的顯式轉換
};

?? 3. 關鍵設計原則與決策
設計維度關鍵問題推薦實踐
對象創建/銷毀構造函數參數?析構函數必要性?RAII模式管理資源
初始化/賦值區別構造函數與賦值操作符行為是否一致?確保一致性
值傳遞方式pass-by-value是否高效?小對象傳值,大對象傳const引用
操作符重載哪些操作符需要重載?僅重載符合直覺的操作符
類型轉換控制是否允許隱式轉換?使用explicit禁止非預期轉換
成員訪問權限哪些成員公開?哪些需要保護?最小化public接口
繼承體系設計是否作為基類?虛函數如何設計?明確聲明finaloverride
模板泛化可能性是否應設計為類模板?評估未來需求
標準庫兼容性是否滿足STL容器要求?提供必要的類型特征

成員函數設計規范

class Polynomial {
public:// 常量成員函數:不修改對象狀態double evaluate(double x) const noexcept;// 異常安全保證void normalize() &;  // 僅限左值對象調用// 引用限定符(C++11)void process() &&;   // 僅限右值對象調用
};

繼承體系設計規范

// 接口類設計
class Drawable {
public:virtual void draw() const = 0;virtual ~Drawable() = default;// 禁止拷貝(接口類通常不可拷貝)Drawable(const Drawable&) = delete;Drawable& operator=(const Drawable&) = delete;
};// 具體實現類
class Circle final : public Drawable {
public:void draw() const override;  // 明確重寫// ...                         // 禁止進一步繼承(final)
};

💡 關鍵原則總結

  1. 生命周期全周期設計
    • 構造/析構:資源獲取即初始化(RAII)
    • 拷貝控制:明確=default/=delete拷貝操作
  2. 類型行為一致性
    • 操作符重載:行為需符合內置類型預期
    • 類型轉換:優先使用explicit和命名轉換函數
  3. 接口最小化原則
    • 成員函數:提供完備但最小的操作集合
    • 訪問控制:嚴格限制private/protected
  4. 繼承體系明確性
    • 基類:聲明虛析構函數,明確抽象接口
    • 派生類:使用final/override明確意圖

危險類設計示例

class AutoPtr {  // 已廢棄的auto_ptr問題
public:// 問題1:允許從臨時對象構造AutoPtr(AutoPtr& other);  // 非const引用// 問題2:轉移所有權但不明確AutoPtr& operator=(AutoPtr& other);// 問題3:支持隱式指針轉換operator void*() const;  // 可能導致誤用
};

安全重構方案

// 解決方案:現代unique_ptr設計理念
template<typename T>
class UniquePtr {
public:// 明確所有權轉移語義UniquePtr(UniquePtr&& other) noexcept;  // 移動構造UniquePtr& operator=(UniquePtr&& other) noexcept; // 移動賦值// 禁止拷貝UniquePtr(const UniquePtr&) = delete;UniquePtr& operator=(const UniquePtr&) = delete;// 顯式bool轉換(安全)explicit operator bool() const noexcept;// 明確資源釋放接口void reset() noexcept;T* release() noexcept;
};

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

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

相關文章

《匯編語言:基于X86處理器》第11章 MS-Windows編程(3)

本章展示的是如何用32 位Microsoft Windows API進行控制臺窗口編程。應用編程接口(API:ApplicationProgramming Interface)是類型、常數和函數的集合體&#xff0c;它提供了一種用計算機代碼操作對象的方式。本章將討論文本I/O、顏色選擇、時間與日期、數據文件I/O&#xff0c;…

在 macOS 上通過 Docker 部署DM8 (ARM 架構)

概述 達夢數據庫 (DM8) 無法直接在 Apple macOS 操作系統上原生安裝&#xff0c;通常需要通過虛擬機&#xff08;如 Parallels Desktop、VMware Fusion&#xff09;進行部署。另一種更輕量級且受 macOS 支持的方案是利用 Docker 容器技術來構建開發與測試環境。本文檔將詳細介…

網絡協議之路由是怎么回事?

寫在前面 要想去外面的世界看看, 就離不了路由器&#xff0c;而路由器工作的原理就是路由&#xff0c;那么具體是怎么路由的呢&#xff1f;本文就一起來看下這部分內容。 1&#xff1a;路由的配置 配置一條路由無非就是在配置以下三個信息&#xff1a; 1:包要去哪里&#x…

2106. 摘水果,梳理思路

文章目錄題目概要java 解法詳解題目概要 在一個無限的 x 坐標軸上&#xff0c;有許多水果分布在其中某些位置。給你一個二維整數數組 fruits &#xff0c;其中 fruits[i] [positioni, amounti] 表示共有 amounti 個水果放置在 positioni 上。fruits 已經按 positioni 升序排列…

深入理解消息隊列(MQ)核心原理與設計精髓

引言&#xff1a;從一個“不堪重負”的訂單系統說起想象一個簡化的電商下單流程&#xff1a;用戶點擊“下單”后&#xff0c;系統需要&#xff1a;在訂單數據庫中創建一條記錄。調用庫存服務&#xff0c;扣減商品庫存。調用營銷服務&#xff0c;給用戶發放積分和優惠券。調用通…

前端手撕題總結篇(算法篇——來自Leetcode牛客)

鏈表指定區域反轉 找到區間&#xff08;頭和為 for循環當**時&#xff09;->反轉鏈表&#xff08;返回反轉過后的頭和尾&#xff09;->連接 function reverseBetween( head , m , n ) {//preEnd&cur&nextStart cur.next斷開if(mn)return head;const vHeadNode…

從Excel到工時管理系統:企業如何選擇更高效的工時記錄工具?

還在為手工統計員工工時而頭疼嗎&#xff1f;月末堆積如山的Excel表格、反復核對的數據、層出不窮的差錯&#xff0c;這些問題正在拖慢企業的發展步伐。8Manage工時管理系統發現&#xff0c;傳統手工記錄不僅耗費大量人力&#xff0c;更讓寶貴的工時數據難以轉化為有效的管理決…

Java設計模式之《命令模式》

目錄 1、介紹 1.1、命令模式定義 1.2、對比 1.3、典型應用場景 2、命令模式的結構 2.1、組成部分&#xff1a; 2.2、整體流程 3、實現 3.1、沒有命令模式 3.2、命令模式寫法 4、命令模式的優缺點 前言 java設計模式分類&#xff1a; 1、介紹 1.1、命令模式定義 命…

【動態規劃算法】路徑問題

什么是動態規劃算法動態規劃&#xff08;Dynamic Programming&#xff0c;簡稱 DP&#xff09;是一種通過分解復雜問題為重疊子問題&#xff0c;并存儲子問題的解以避免重復計算&#xff0c;從而高效求解具有特定性質&#xff08;重疊子問題、最優子結構&#xff09;問題的算法…

Java基本技術講解

一、基礎語法三要素 暫時無法在飛書文檔外展示此內容 &#x1f511; 黃金法則?&#xff1a;每個變量都要聲明類型&#xff01;二、程序邏輯控制&#xff08;游戲行為核心&#xff09; 條件判斷&#xff1a;if-else - “岔路口選擇” // 撿到金幣邏輯 if (isTouching(Coin.clas…

【網絡基礎2】路由器的 “兩扇門”:二層接口和三層接口到底有啥不一樣?

目錄 前言:路由器不是只有 “插網線的口” 一、先搞懂一個基礎:路由器是 “網絡交通樞紐” 二、二層接口:“小區內部的單元門”,只認 “住戶身份證” 1. 啥是二層接口? 2. 用 “小區內部串門” 理解二層接口 步驟 1:手機打包數據,寫上 “收件人身份證” 步驟 2:二…

MLIR TableGen

簡介 TableGen 是一種領域特定語言&#xff08;DSL&#xff09;&#xff0c;TableGen 的設計目標是允許編寫靈活的描述&#xff0c;并將記錄的通用特性提取出來&#xff0c;從而減少重復代碼并提高代碼的可維護性。 TableGen的工作流程&#xff1a; 前端解析&#xff1a; Ta…

2、docker容器命令 | 信息查看

1、命令總覽命令作用docker ps查看運行中的容器&#xff08;-a查看所有容器&#xff09;docker logs [CONTAINER]查看容器日志&#xff08;-f實時追蹤日志&#xff09;docker inspect [CONTAINER]查看容器詳細信息&#xff08;JSON格式&#xff09;docker stats [CONTAINER]實時…

【MySQL】MySQL中鎖有哪些?

一、按照粒度分類&#xff1a; 粒度越小&#xff0c;并發度越高&#xff0c;鎖開銷越大。 1.全局鎖&#xff1a; 作用&#xff1a; 鎖定整個MySQL實例(所有數據庫)。適用場景&#xff1a; 全庫邏輯部分。(確保備份期間數據的一致性。)實現方式&#xff1a; 通過 FLUSH TABLES W…

語義分割--deeplabV3+

根據論文網絡結構圖講一下&#xff1a;網絡分為兩部分&#xff1a;encoder和decoder部分。 Encoder&#xff1a;DCNN就是主干網絡&#xff0c;例如resnet&#xff0c;Xception&#xff0c;MobileNet這些&#xff08;主干網絡也要使用空洞卷積&#xff09;&#xff0c;對dcnn的結…

Azure DevOps 中的代理

必知詞匯 深入研究 Azure DevOps 中的代理之前需要掌握的基本概念: 代理:Azure DevOps 中的代理是一個軟件組件,負責執行流水線中的任務和作業。這可能包括數據中心內的物理服務器、本地或云端托管的虛擬機,甚至是容器化環境。這些代理可以在各種操作系統和環境中運行,例如…

AUTOSAR進階圖解==>AUTOSAR_SRS_ADCDriver

AUTOSAR ADC驅動詳解 基于AUTOSAR標準的ADC驅動模塊需求規范分析目錄 ADC驅動模塊概述 關鍵概念定義 ADC驅動架構 ADC驅動在AUTOSAR分層架構中的位置ADC驅動的主要職責 ADC驅動配置結構 通用配置(AdcGeneral)硬件單元配置(AdcHwUnit)通道配置(AdcChannel)通道組配置(AdcChanne…

寶馬集團與SAP聯合打造生產物流數字化新標桿

在德國雷根斯堡的寶馬工廠&#xff0c;每57秒就有一輛新車下線。這座工廠不僅是汽車制造的基地&#xff0c;更是寶馬集團向SAP S/4HANA云平臺轉型的先鋒項目。通過“RISE with SAP”計劃&#xff0c;寶馬將該工廠的運營系統全面遷移至SAP S/4HANA Cloud Private Edition&#x…

Go 語言實戰:構建一個高性能的 MySQL + Redis 應用

引言&#xff1a;為什么是 Go MySQL Redis&#xff1f;在現代后端技術棧中&#xff0c;Go MySQL Redis 的組合堪稱“黃金搭檔”&#xff0c;被廣泛應用于各種高并發業務場景。Go 語言&#xff1a;以其卓越的并發性能、簡潔的語法和高效的執行效率&#xff0c;成為構建高性能…

Excel超級處理器,多個word表格模板中內容提取到Excel表格中

在職場中&#xff0c;很多人習慣在word里插入表格&#xff0c;設計模板&#xff0c;填寫內容&#xff0c;一旦有多個word文件需要整理在excel表格中&#xff0c;最常見的工作方式就是每個word文件打開&#xff0c;復制&#xff0c;粘貼到excel表格里&#xff0c;這樣的工作方式…