c++ :運算符重載函數中的細節

賦值運算符重載與拷貝構造函數

(1)區分初始化時的賦值(一般就叫初始化),和非初始化時的賦值(一般就叫賦值)
(2)實驗驗證初始化和賦值時各自對應

避免賦值運算符中的自賦值

(1)自賦值就是Person a; a = a;
(2)自賦值如果不處理,輕則浪費效率,重則導致內存丟失(該深拷貝時做了淺拷貝,在2.4.8中詳解)
(3)避免自賦值很簡單,只需要在賦值運算符重載函數所有操作前加上一個判斷 if (this != &other)即可

  // 重載賦值運算符// Coordinate operator=(const Coordinate &other)// {//這樣會導致重載賦值運算時會執行這個函數Coordinate &operator=(const Coordinate &other) {  //這樣就不會std::cout << "  重載賦值運算符 " << std::endl;if (this == &other) {return *this;  // 處理自賦值}x = other.x;y = other.y;return *this;}

賦值運算符重載函數返回引用

返回引用好處1:提升程序效率
(1)賦值運算符重載函數返回值可以返回對象類型,也可以返回對象引用類型,都能工作。代碼驗證
(2)區別在于:返回引用可以避免一次返回值值傳遞的對象復制,這需要消耗資源的。代碼驗證
(3)總結:雖然C++語法并未強制要求,但是好的寫法是應該返回引用

返回引用好處2:允許連續賦值式
(1)返回對象而不是引用時,在連續賦值(c = a = b;)時會編譯可以,運行也可以,但是效率低同1中所講。
(2)原因是先執行a=b操作,返回值再作為第2次賦值運算的右值(也就是函數參數),對象和引用是類型兼容的
(3)總結:連等在返回對象和引用時都可以,但是在返回void時就不可以了

  Coordinate &operator=(const Coordinate &other) {  //這樣就不會std::cout << "  重載賦值運算符 " << std::endl;if (this == &other) {return *this;  // 處理自賦值}x = other.x;y = other.y;return *this;}Coordinate *operator=(const Coordinate *other) {std::cout << "  *other重載賦值運算符 " << std::endl;if (this == other) {return this;  // 處理自賦值}x = other->x;y = other->y;return this;}Coordinate a(3, 4);Coordinate b = a;  // 拷貝構造函數Coordinate c;c = &a;      //*other重載賦值運算符 c =  b;  // 重載賦值運算符std::cout << "a: " << a << std::endl;std::cout << "b: " << b << std::endl;std::cout << "c: " << c << std::endl;

總結

定義新變量并且使用已有變量對堆新變量進行初始化時會調用拷貝構造函數
對已經定義的變量使用已有變量進行賦值運算時會調用賦值運算符

函數返回值不同,不能構成重載
運算符重載傳參的尷尬,導致引用的產生

學習記錄,侵權聯系刪除。
來源:朱老師物聯網大課堂

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

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

相關文章

鞭炮插畫:成都亞恒豐創教育科技有限公司

鞭炮插畫&#xff1a;年味里的絢爛記憶 在歲末年初的溫柔時光里&#xff0c;總有一抹色彩&#xff0c;能瞬間喚醒沉睡的年味——那便是鞭炮插畫中躍動的紅與金&#xff0c;成都亞恒豐創教育科技有限公司 它們不僅僅是紙與墨的交織&#xff0c;更是情感與記憶的橋梁&#xff0c…

自適應手機版大學職業技術學院網站模版源碼系統 帶完整的安裝代碼包以及搭建部署教程

系統概述 隨著智能手機的普及和移動互聯網技術的飛速發展&#xff0c;用戶越來越傾向于通過移動設備訪問網站。對于大學職業技術學院而言&#xff0c;一個能夠自適應各種屏幕尺寸、操作流暢、內容豐富的移動端網站&#xff0c;不僅能夠提升用戶體驗&#xff0c;還能有效擴大學…

最短路之樸素版的dij板子

模板&#xff1a; 注意這個只是單向的雙向的需要在更新一次 #include<bits/stdc.h>using namespace std;typedef long long ll; typedef pair<int, int>PII; const int N2e510; const int MOD 998244353; const int INF0X3F3F3F3F; const int dx[]{-1,1,0,0,-1,…

【Python Tips】將一個列表List元素添加進另一個列表List

一、引言 在處理Python列表數據類型時&#xff0c;有時需要合并兩個列表&#xff0c;下面是幾種列表合并的操作代碼&#xff0c;尤其是對于長列表的高效合并方式&#xff0c;記錄在此。 二、列表合并方式 1. 使用extend方法 extend方法將一個列表中的所有元素添加到另一個列表…

mysql快速精通(三)表關系

主打一個實用 一. 一對多&#xff08;多對一&#xff09;關系 例如班級和學生&#xff0c;這種類型我們一般建兩個表,一方為主表&#xff0c;多方為從表 二. 多對多 例如課程與學生&#xff0c;這種類型我們一般需要建三張表&#xff0c;兩張一方主表&#xff0c;與一張多方從表…

初識影刀:EXCEL根據部門篩選低值易耗品

第一次知道這個辦公自動化的軟件還是在招聘網站上&#xff0c;了解之后發現對于辦公中重復性的工作還是挺有幫助的&#xff0c;特別是那些操作非EXCEL的重復性工作&#xff0c;當然用在EXCEL上更加方便&#xff0c;有些操作比寫VBA便捷。 下面就是一個了解基本操作后&#xff…

[Linux]CentOS軟件的安裝

一、Linux 軟件包管理器 yum 1.Linux安裝軟件的方式 在linux中安裝軟件常用的有三種方式&#xff1a; 源代碼安裝&#xff08;我們還需要進行編譯運行后才可以&#xff0c;很麻煩&#xff09; rpm安裝&#xff08;Linux的安裝包&#xff0c;需要下載一些rpm包&#xff0c;但是…

基于機器學習的鋰離子電池容量估計(MATLAB R2021B)

鋰離子電池已經廣泛應用于電動汽車或混合動力汽車的能源存儲裝置。由于電化學成分的衰退&#xff0c;鋰離子電池隨著使用時間的增加&#xff0c;電池性能不斷退化&#xff0c;導致電池容量和功率發生衰退。電池容量衰退的因素主要有金屬鋰沉積&#xff0c;活性物質分解和電解液…

深度學習DeepLearning多元線性回歸 學習筆記

文章目錄 多維特征變量與術語公式多元線性回歸正規方程法Mean normalizationZ-score normalization設置合適的學習率Feature engineering 多維特征 變量與術語 列屬性xj屬性數n x ? \vec{x} x (i)行向量某個值 x ? j i \vec{x}_j^i x ji?上行下列均值μ標準化標準差σsigm…

SpringMVC 中常用注解

在 SpringMVC 框架的開發中&#xff0c;注解的合理運用能夠極大地提高開發效率和代碼的可維護性。今天&#xff0c;讓我們一起來總結一下 SpringMVC 中一些常用的注解及其用法。 一、Controller 注解 Controller 用于標識一個控制器類&#xff0c;該類中的方法用于處理用戶的請…

ArduPilot開源代碼之AP_AHRS_Backend

ArduPilot開源代碼之AP_AHRS_Backend 1. 源由2. 類繼承關系3. 框架設計2.1 構造函數和析構函數2.2 不可復制2.3 嵌套結構和枚舉2.4 虛方法2.5 靜態方法2.6 實用方法2.7 純虛方法2.8 條件編譯 3. 虛方法設計3.1 初始化3.1.1 構造函數3.1.2 析構函數3.1.3 AP_AHRS_Backend::init …

Chromium CI/CD 之Jenkins實用指南2024-如何創建新節點(三)

1. 前言 在前一篇《Jenkins實用指南2024-系統基本配置&#xff08;二&#xff09;》中&#xff0c;我們詳細介紹了如何對Jenkins進行基本配置&#xff0c;包括系統設置、安全配置、插件管理以及創建第一個Job。通過這些配置&#xff0c;您的Jenkins環境已經具備了基本的功能和…

基于pyqt5實現xlsx選擇器應用程序

環境搭建 基于python3.12pyqt5 pip3 install PyQt5 pip3 install pyinstallerpyinstaller --onefile --windowed test.py代碼 新建main.py import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLineEdit, QFileDial…

leetcode 665.非遞減數列

1.題目要求: 給你一個長度為 n 的整數數組 nums &#xff0c;請你判斷在 最多 改變 1 個元素的情況下&#xff0c;該數組能否變成一個非遞減數列。我們是這樣定義一個非遞減數列的&#xff1a; 對于數組中任意的 i (0 < i < n-2)&#xff0c;總滿足 nums[i] < nums[i…

Java 設計模式系列:外觀模式

簡介 外觀模式&#xff08;Facade Pattern&#xff09;是一種設計模式&#xff0c;又名門面模式&#xff0c;是一種通過為多個復雜的子系統提供一個一致的接口&#xff0c;而使這些子系統更加容易被訪問的模式。該模式對外有一個統一接口&#xff0c;外部應用程序不用關心內部…

Android中RecyclerView使用詳解(一)

目錄 概述優點列表布局RecyclerView一、創建RecyclerView并且在布局中綁定二、實現RecyclerView單個item的布局三、給RecyclerView寫一個對應的適配器Adapter1.創建自定義的ViewHolder2.繼承Adapter&#xff0c;泛型使用我們自定義的ViewHolder3.重寫Adapter的三個方法onCreate…

線程安全(二)synchronized 的底層實現原理、鎖升級、對象的內存結構

目錄 一、基礎使用1.1 不加鎖的代碼實現1.2 加鎖的代碼實現二、實現原理2.1 synchronized 簡介2.2 對象監控器(Monitor)2.3 加鎖過程第一步:判斷 Owner 指向第二步:進入 EntryList 阻塞第三步:主動進入 WaitSet 等待三、鎖升級3.1 對象的內存結構3.2 Mark Word 對象頭3.3 …

MySQL sql_safe_updates參數

sql_safe_updates 是 MySQL 中的一個系統變量&#xff0c;用于控制 MySQL 服務器是否允許在沒有使用 KEY 或 LIMIT 子句的 UPDATE 或 DELETE 語句上執行更新或刪除操作。當這個變量被設置為 ON 時&#xff0c;MySQL 會拒絕那些可能影響到表中大量行的 UPDATE 或 DELETE 語句&am…

SpringBoot實戰:多表聯查

1. 保存和更新公寓信息 請求數據的結構 Schema(description "公寓信息") Data public class ApartmentSubmitVo extends ApartmentInfo {Schema(description"公寓配套id")private List<Long> facilityInfoIds;Schema(description"公寓標簽i…

LLM用于時序預測真的不行,連推理能力都沒用到

語言模型真的能用于時序預測嗎&#xff1f;根據貝特里奇頭條定律&#xff08;任何以問號結尾的新聞標題&#xff0c;都能夠用「不」來回答&#xff09;&#xff0c;答案應該是否定的。事實似乎也果然如此&#xff1a;強大如斯的 LLM 并不能很好地處理時序數據。 時序&#xff0…