拷貝構造函數如果不加引用會怎樣?

?博主介紹:程序喵大人

  • 35- 資深C/C++/Rust/Android/iOS客戶端開發
  • 10年大廠工作經驗
  • 嵌入式/人工智能/自動駕駛/音視頻/游戲開發入門級選手
  • 《C++20高級編程》《C++23高級編程》等多本書籍著譯者
  • 更多原創精品文章,首發gzh,見文末
  • 👇👇記得訂閱專欄,以防走丟👇👇
    😉C++基礎系列專欄
    😃C語言基礎系列專欄
    🤣C++大佬養成攻略專欄
    🤓C++訓練營
    👉🏻個人網站

最近訓練營里有同學問:

圖片

那拷貝構造函數不加引用會怎么樣呢?

貼段代碼:

#include <iostream>
class A {public:    A() {std::cout << "A \n";}~A() {std::cout << "~A \n";}// A(const A& a) {    //     std::cout << "A(const& A) \n";    // }    A(const A a) {        std::cout << "A(const A) \n";}A& operator=(const A& a) {if (&a == this) {return *this;}std::cout << "operator= \n";return *this;}
};

編譯結果如圖:

圖片

可以看到,如果拷貝構造函數不加引用,編譯都會失敗的,那為什么編譯器要這樣限制,為什么一定要加引用呢?

拷貝構造函數的參數必須是引用,因為如果不是,我們將不得不通過值傳遞對象。通過值傳遞對象將需要拷貝對象,這將調用拷貝構造函數。

這會導致拷貝構造函數調用的無限循環,而通過使用引用,就可以避免這個無限循環,因為引用不會創建新對象,而是指向現有對象的內存位置。

考慮以下帶有接受引用參數的拷貝構造函數的類:

class MyClass {
public:int a;// 常規構造函數MyClass(int value) : a(value) {}// 接受引用參數的拷貝構造函數MyClass(const MyClass &obj) {a = obj.a;}
};
int main() {MyClass original(5); // 調用常規構造函數MyClass copy(original); // 調用接受引用參數的拷貝構造函數
}

在這個例子中,創建copy對象時,調用了拷貝構造函數,并且它接受對original對象的引用。這避免了無限循環問題,因為引用簡單地指向現有對象的內存位置,并且在過程中沒有創建新對象。

如果不加引用:

MyClass(MyClass obj) {a = obj.a;
}

這將在拷貝時導致無限循環,因為:

  1. 通過值傳遞時會創建一個新對象。

  2. 創建新對象需要調用拷貝構造函數

  3. 調用拷貝構造函數需要通過值傳遞對象,導致步驟1。

通過在拷貝構造函數中使用引用參數,可以防止這種無限循環,因為在傳遞引用時不會創建新對象。

所以編譯器直接在源頭就規避了這種問題,防止我們多踩坑。

???碼字不易,歡迎大家點贊關注評論,謝謝!

C++訓練營

專為校招、社招3年工作經驗的同學打造的1V1 C++訓練營,量身定制學習計劃、每日代碼review,簡歷優化,面試輔導,已幫助多名學員獲得大廠offer!

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

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

相關文章

UE5中制作動態數字Decal

在進行城市道路編輯時&#xff0c;經常需要繪制人行道、交通標志、停車線等路面元素。如果能夠使用具有動態修改功能的 Decal&#xff08;貼花&#xff09;&#xff0c;將大大提升編輯效率和靈活性。接下來講解如何制作。 1.首先準備一張包含所需元素的Texture&#xff0c;這里…

【Leetcode 每日一題】2900. 最長相鄰不相等子序列 I

問題背景 給你一個下標從 0 0 0 開始的字符串數組 w o r d s words words&#xff0c;和一個下標從 0 0 0 開始的 二進制 數組 g r o u p s groups groups&#xff0c;兩個數組長度都是 n n n。 你需要從 w o r d s words words 中選出 最長子序列。如果對于序列中的任何…

ProfibusDP主站轉ModbusRTU/TCP與橫河AXG電磁流量計通訊案例

ProfibusDP主站轉ModbusRTU/TCP與橫河AXG電磁流量計通訊案例 在當今數字化工業時代&#xff0c;智能儀表與控制系統的互聯互通成為提高生產效率和管理水平的關鍵。橫河AXG電磁流量計作為一款高性能的流量測量設備&#xff0c;在多個行業得到了廣泛應用。而Profibus DP作為一種…

微軟向現實低頭:悄悄延長Windows 10的Microsoft 365支持

快科技5月11日消息&#xff0c;Windows 10將在今年10月14日正式結束支持&#xff0c;此前微軟曾明確表示&#xff0c;Microsoft 365&#xff08;M365&#xff09;應用&#xff0c;如Outlook、Teams、OneDrive、Word、Excel等&#xff0c;也將隨之停止支持。 不過無法升級至Win…

【Spring AI】模型記憶持久化 + 自動加載記憶上下文

當我們利用大模型進行開發時&#xff0c;有時會因為項目重啟而丟失模型的記憶&#xff0c;會給開發的過程帶來不方便 接下來我將介紹如何將模型的記憶持久化&#xff0c;并保證在項目重啟后依然能能夠正常加載記憶上下文。 我們在配置ChatClient時&#xff0c;由于想要實現模…

(C語言)超市管理系統 (正式版)(指針)(數據結構)(清屏操作)(文件讀寫)

目錄 前言&#xff1a; 源代碼&#xff1a; product.h product.c fileio.h fileio.c main.c 代碼解析&#xff1a; 一、程序結構概述 二、product.c 函數詳解 1. 初始化商品列表 Init_products 2. 添加商品 add_product 3. 顯示商品 display_products 4. 修改商品 mo…

[服務器面板對比] 寶塔、aaPanel、Plesk、cPanel 哪家強?功能、性能與價格橫評 (2025)

對于很多 Linux 服務器用戶來說&#xff0c;直接面對黑乎乎的命令行界面 (CLI) 進行各種操作&#xff0c;雖然強大靈活&#xff0c;但也確實有一定的學習門檻和操作復雜度。特別是當你需要管理多個網站、數據庫、FTP賬戶&#xff0c;或者進行日常的軟件安裝、安全配置、日志查看…

WebGL圖形編程實戰【7】:變換流水線 × 坐標系與矩陣精講

變換流水線 #mermaid-svg-Omabd9LSNCdIvWqB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Omabd9LSNCdIvWqB .error-icon{fill:#552222;}#mermaid-svg-Omabd9LSNCdIvWqB .error-text{fill:#552222;stroke:#552222;…

電力電容器故障利用沃倫森(WARENSEN)工業設備智能運維系統解決方案

行業工況背景 當配電室報警顯示“電容器故障”時&#xff0c;管理者可能會感到焦慮。沃倫森&#xff08;WARENSEN&#xff09;憑借十多年的電力補償設備服務經驗&#xff0c;提供了科學的故障應對流程&#xff0c;幫助避免大部分二次損失。 一、五大常見故障現象快速識別 溫度…

星海智算云平臺部署GPT-SoVITS模型教程

背景 隨著 GPT-SoVITS 在 AI 語音合成領域的廣泛應用&#xff0c;越來越多的個人和團隊開始關注這項前沿技術。你是否也在思考&#xff0c;如何快速、高效地部署并體驗這款強大的聲音克隆模型&#xff1f;遺憾的是&#xff0c;許多本地部署方案不僅配置復雜&#xff0c;而且對…

高吞吐與低延遲的博弈:Kafka與RabbitMQ數據管道實戰指南

摘要 本文全面對比Apache Kafka與RabbitMQ在數據管道中的設計哲學、核心差異及協同方案。結合性能指標、應用場景和企業級實戰案例,揭示Kafka在高吞吐流式處理中的優勢與RabbitMQ在復雜路由和低延遲傳輸方面的獨特特點;介紹了使用Java生態成熟第三方庫(如Apache Kafka Clie…

Python零基礎入門到高手8.4節: 元組與列表的區別

目錄 8.4.1 不可變數據類型 8.4.2 可變數據類型 8.4.3 元組與列表的區別 8.4.4 今天彩票沒中獎 8.4.1 不可變數據類型 不可變數據類型是指不可以對該數據類型進行原地修改&#xff0c;即只讀的數據類型。迄今為止學過的不可變數據類型有字符串&#xff0c;元組。 在使用[]…

無人機數據處理與特征提取技術分析!

一、運行邏輯 1. 數據采集與預處理 多傳感器融合&#xff1a;集成攝像頭、LiDAR、IMU、GPS等傳感器&#xff0c;通過硬件時間戳或PPS信號實現數據同步&#xff0c;確保時空一致性。 邊緣預處理&#xff1a;在無人機端進行數據壓縮&#xff08;如JPEG、H.265&#xff09;…

LeetCode 熱題 100 105. 從前序與中序遍歷序列構造二叉樹

LeetCode 熱題 100 | 105. 從前序與中序遍歷序列構造二叉樹 大家好&#xff0c;今天我們來解決一道經典的二叉樹問題——從前序與中序遍歷序列構造二叉樹。這道題在 LeetCode 上被標記為中等難度&#xff0c;要求根據給定的前序遍歷和中序遍歷序列&#xff0c;構造并返回二叉樹…

CSS- 1.1 css選擇器

本系列可作為前端學習系列的筆記&#xff0c;代碼的運行環境是在HBuilder中&#xff0c;小編會將代碼復制下來&#xff0c;大家復制下來就可以練習了&#xff0c;方便大家學習。 HTML系列文章 已經收錄在前端專欄&#xff0c;有需要的寶寶們可以點擊前端專欄查看&#xff01; 系…

MongoClient和AsyncIOMotorClient的區別和用法

示例代碼&#xff1a; from motor.motor_asyncio import AsyncIOMotorClient from pymongo import MongoClient&#x1f50d; 這兩個庫分別是&#xff1a; 名字說明舉個例子pymongo.MongoClient同步版 的 MongoDB 客戶端&#xff08;常規阻塞式操作&#xff09;你在主線程里一…

5.15打卡

浙大疏錦行 DAY 26 函數專題1 知識點回顧&#xff1a; 1. 函數的定義 2. 變量作用域&#xff1a;局部變量和全局變量 3. 函數的參數類型&#xff1a;位置參數、默認參數、不定參數 4. 傳遞參數的手段&#xff1a;關鍵詞參數 5. 傳遞參數的順序&#xff1a;同時出現三種參數…

針對面試-mysql篇

1.如何定位慢查詢? 1.1.介紹一下當時產生問題的場景(我們當時的接口測試的時候非常的慢&#xff0c;壓測的結果大概5秒鐘))&#xff0c;可以監測出哪個接口&#xff0c;最終因為是sql的問題 1.2.我們系統中當時采用了運維工具(Skywalking就是2秒&#xff0c;一旦sql執行超過2秒…

window 顯示驅動開發-報告圖形內存(三)

圖形內存報告示例 示例 1&#xff1a;筆記本電腦上的 128 MB 專用板載圖形內存 以下屏幕截圖顯示了使用 Intel Iris 離散圖形適配器運行 Windows 11 的 Surface 筆記本電腦的計算圖形內存數。 適配器的可用內存總數為 16424 MB&#xff0c;用于圖形用途&#xff0c;細分如下&…

極簡主義現代商務風格PPT模版6套一組分享下載

現代商務風格PPT模版下載https://pan.quark.cn/s/12fbc52124d9 第一張PPT模版&#xff0c;簡約風&#xff0c;橄欖綠背景&#xff0c;黑色豎條裝飾&#xff0c;文字有中英文標題和占位符。需要提取關鍵元素&#xff1a;簡約、橄欖綠、對稱布局、占位文本的位置。 風格?&#…