c++ Effective c++ 條款5

class MyClass {
public:MyClass(int& ref, const int c_val) : myRef(ref), myConstVal(c_val) {}// 明確刪除拷貝操作MyClass(const MyClass&) = delete;MyClass& operator=(const MyClass&) = delete;private:int& myRef;       // 引用成員const int myConstVal; // const成員
};

注意資源管理陷阱


1. 賦值運算符的調用條件

賦值運算符 operator= 的語義是:將右側對象的內容復制到左側已存在的對象中。因此:

  • 左側對象必須已經存在(已構造完成)。
  • 如果左側對象尚未構造,C++ 會調用?拷貝構造函數?來初始化左側對象。

2. 示例對比

場景 1:調用賦值運算符
Derived md;      // md 已經存在
md = bd;         // ? 調用賦值運算符 Derived::operator=
  • 解釋md?是一個已經構造的對象,此時?md = bd;?會調用?Derived::operator=
場景 2:調用拷貝構造函數
Derived md = bd; // ? 調用拷貝構造函數 Derived::Derived(const Derived&)
  • 解釋md?是一個新對象,尚未構造,因此 C++ 會調用?拷貝構造函數,而非賦值運算符。

3. 為什么?Derived md = bd;?調用的是拷貝構造函數?

C++ 的語法規則規定:

  • T a = b;?等價于?T a(b);(即調用拷貝構造函數),而不是?a = b;
  • 因此,Derived md = bd;?實際上是初始化語句,觸發的是?拷貝構造函數

4. 如何顯式觸發賦值運算符?

要調用賦值運算符,必須確保左側對象已經存在。例如:

Derived md;      // md 已構造
md = bd;         // ? 調用賦值運算符

5. 總結:關鍵區別

操作調用函數左側對象是否存在?
Derived md = bd;拷貝構造函數? 不存在(初始化)
Derived md; md = bd;賦值運算符? 存在(已構造)

6. 參考知識庫

  • 知識庫 [1] 的說明

    賦值運算符不會創建新對象,而是操作左側已有對象。 左側對象必須已經存在,賦值運算符不會重新創建它。

  • 知識庫 [10] 的說明

    賦值操作和初始化操作都會導致對象被復制。賦值是將一個對象的值分配給另一個對象,而初始化是在聲明新對象時進行的。


7. 常見陷阱

  • 誤認為?a = b;?一定調用賦值運算符:如果?a?是新對象,a = b;?會調用賦值運算符;但如果?a?是初始化語句的一部分(如?T a = b;),則調用拷貝構造函數。
  • 調試建議:在?operator=?中添加日志(如?std::cout),觀察何時被調用。

通過理解這一規則,你可以避免混淆拷貝構造和賦值運算符的調用場景,編寫更健壯的 C++ 代碼。

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

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

相關文章

如何使用 Xshell 8 連接到一臺 CentOS 7 電腦(服務器)

什么是 Xshell? Xshell 是一款功能強大的、適用于 Windows 平臺的終端模擬器。它支持 SSH (Secure Shell)、SFTP、TELNET、RLOGIN 和 SERIAL 等多種網絡協議,讓用戶能夠安全地連接和管理遠程服務器。 對于開發者、系統管理員和網絡工程師來說&#xff…

CSS scale函數詳解

目錄 基本語法 核心特性 常用場景示例 1. 等比例縮放(X 軸和 Y 軸相同) 2. 非等比例縮放(X 軸和 Y 軸不同) 3. 翻轉并縮放 4. 配合過渡動畫實現交互效果 5. 圖片懸停縮放效果 6. 縮放原點調整 與其他變換組合使用 注意…

【MATLAB代碼】基于EKF的二維組合導航仿真代碼,狀態量為位置、速度、航向角與IMU偏置,觀測量為XY軸的位置和速度,附完整代碼

8維狀態量(2維位置、2維速度、航向角、航向角偏置、2維加速度計偏置)+4維觀測量(2維位置、2維速度)。 訂閱專欄后,可直接查看源代碼,粘貼到MATLAB空腳本中即可直接運行、得到結果 文章目錄 運行結果 MATLAB源代碼 程序詳解 ?? 程序概述 狀態預測(狀態轉移函數) 狀態雅…

OpenCV 圖像輪廓檢測

目錄 一、輪廓檢測基礎概念 二、核心 API 詳解:cv2.findContours () 參數說明: 返回值說明: 三、輪廓檢測實戰步驟 1. 圖像預處理(灰度化與二值化) 2. 查找輪廓 3. 繪制輪廓 四、輪廓的常用屬性與操作 1. 輪…

【圖論】 Graph.jl 概覽

文章目錄安裝基礎使用基本操作全局圖的指標頂點性質邊性質讀寫圖按照 .lgz 格式存儲圖數據(壓縮格式)按照 .lg 格式存儲圖數據(非壓縮格式)圖的繪制TikzGraphs.jl Latex 論文風格GraphPlot.jl 通常與 Compose.jl 一起使用SGtSNEpi…

[java] 控制三個線程按順序交替輸出數字123123…

控制三個線程按順序交替輸出數字123123… synchronized(配合專用鎖對象) 通過共享鎖和 volatile 變量控制執行順序,每個線程按指定順序打印指定內容,確保輸出序列如 “123123…”。使用 synchronized 和 wait/notifyAll 實現線程間…

[C#]winform基于yolov8-seg實現的指甲分割實現源碼

【測試環境】 vs2019 net framework4.7.2 onnxruntime1.16.3 opencvsharp 注意源碼運行在CPU上不支持GPU運行,由于net framework限制GPU會很慢因此沒有GPU版本提供。 【運行步驟】 打開sln項目 選擇x64 debug運行即可 如需要再x64 release運行可以將x64 debu…

數據結構——線性表(鏈表,力扣中等篇,增刪查改)

文章目錄一、增刪查改1.1增(插入節點)1.1.1兩數后插入公約數1.1.2循環有序鏈表的插入1.2刪(移除節點)1.2.1刪除已知的node節點【交換val值】1.2.2移除數組中已存在的節點【unordered_set】1.2.3刪除和為0的節點【前綴和】1.3改&am…

【Android】OkHttp發起GET請求 POST請求

三三要成為安卓糕手 一:OkHttp介紹 OkHttp 是一個開源的、強大且高效的 HTTP 客戶端庫,主要用于在 Java后端和Android 項目中進行網絡請求。 //在gradle中添加依賴 com.squareup.okhttp3:okhttp:4.12.0二:GET請求/*** 使用OkHttp發起get請求*…

[Mysql數據庫] 知識點總結8

1. 請詳細描述在復制拓撲中參與復制的線程類型以及各自所承擔的功能。答:當從屬服務器連接到主服務器時,在主服務器上會創建 Binlog 轉儲線程,在從屬服務器上會默 認創建 I/O 線程和 SQL 線程。- Binlog 轉儲線程用于從二進制日志讀取事件并將…

250829-Gitlab數據備份與恢復

下面給你一份可落地的遷移方案,保證 GitLab 的數據和配置完整遷移到服務器 B。你當前用的是 GitLab Omnibus(docker 版),數據都在你映射的 3 個目錄里(/etc/gitlab, /var/log/gitlab, /var/opt/gitlab)&…

吳恩達機器學習作業十一:異常檢測

數據集在作業一異常檢測異常檢測就是發現與大部分對象不同的對象,其實就是發現離群點。異常檢測有時也稱偏差檢測。異常對象是相對罕見的。用數據集建立概率模型p ( x ),如果新的測試數據在這個模型上小于某個閾值,則說它極大可能為異常點算法…

2000w 的數據量,mysql要進行幾次IO操作,為什么

在 MySQL 中,2000 萬數據量的表在進行查詢時所需的 ??IO 操作次數??主要取決于 ??索引結構(B樹層級)??、??查詢類型??和 ??數據分布特征??。以下是具體分析:一、B樹層級與 IO 次數的關系InnoDB 引擎通過 B樹索引管…

【代碼隨想錄day 22】 力扣 39. 組合總和

視頻講解:https://www.bilibili.com/video/BV1KT4y1M7HJ/?vd_sourcea935eaede74a204ec74fd041b917810c 文檔講解:https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C.html#%E6%80%9D%E8%B7%AF 力扣題目:https://leetcod…

DrissionPage 實戰:動態 IP 代理與百度翻譯 API 數據抓取

本文將詳細介紹如何使用 DrissionPage 實現動態 IP 代理訪問,并結合百度翻譯 API 進行數據抓取與處理。一、技術選型與架構設計1.1 為什么選擇 DrissionPage?DrissionPage 作為新一代網絡自動化工具,相比傳統 Selenium Requests 方案具有顯著…

策略模式:靈活應對算法動態切換

引言 在軟件開發中,我們常常會遇到需要在運行時動態選擇和切換算法或行為的場景。例如,電商系統中的多種支付方式、游戲中的不同難度設置,或是計算器中的各種運算符。傳統的方法可能會使用復雜的條件判斷語句(如if-else或switch-c…

【C++ 】string類:深拷貝與淺拷貝解析

【C 】string類操作全解析-CSDN博客 1.stirng類的模擬實現 1.1 經典的string類問題 上面已經對string類進行了簡單的介紹,大家只要能夠正常使用即可。在面試中,面試官總喜歡要求自己來模擬實現string類,最主要是實現string類的構造、拷貝…

Decoder 解碼器

Decoder 解碼器&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>#include <libavformat/avformat.h> #include <libavcodec/avcodec.h> #include <libswscale/swscale.h>#define WORD uint16_t #define DWORD ui…

globals() 小技巧

scheduler_class globals()[scheduler_class_name] Python 中一種 動態獲取類對象 的常用技巧&#xff0c;屬于 反射&#xff08;reflection&#xff09; 編程的范疇globals()Python 內置函數&#xff0c;返回一個 字典&#xff08;dict&#xff09;&#xff0c;包含當前模塊&…

Android Studio 9.png制作

一、新建 二、把要做的圖png導入進去 png圖片建議 根據內容預留1像素可拉伸區域 eg:純色或可漸變底色 三、右邊創建.9.png 四、雙擊打開 1、繪制黑邊 參考視頻 2、縮放到800% ,移至右下 3、在下面和右邊繪制整根黑線 4、根據png 位置左側和上側黑線 4.1 分析 紅色方框為…