C++ 類和對象 賦值運算符重載

前言:

在上文我們知道數據類型分為自定義類型和內置類型,當我想用內置類型比較大小是非常容易的但是在C++中成員變量都是在類(自定義類型)里面的,那我想給類比較大小那該怎么辦呢?這時候運算符重載就出現了

一 運算符重載概念:

允許用戶為自定義類定義或重新定義運算符的行為,使這些類在使用運算符時表現得像內置數據類型一樣,從而提高代碼的可讀性和簡潔性。

1.2 運算符重載與函數重載的區別:

我第一次聽到這兩個重載都傻傻的分不清楚,以為是一個意思。其實他們的區別可大了

函數重載:

函數重載是指在同一作用域中有多個同名函數,但它們的參數列表(參數的類型和數量)不同。編譯器通過參數列表來決定調用哪個函數。函數重載的目的是為了提高代碼的可讀性和靈活性,使同一操作可以應用于不同類型的參數。

運算符重載:

運算符重載允許我們為用戶定義的類型(如類)定義或重新定義特定運算符(如 +、-、*、/ 等)的行為。運算符重載函數的名稱為 operator 后跟運算符符號。盡管這些函數的返回類型和參數列表與普通函數類似,但它們的目的是使自定義類型能夠使用像內置類型一樣的運算符

1.3?運算符特點:

1 定義運算符重載函數:運算符重載是通過定義特殊的成員函數全局函數來實現的

2 運算符重載函數的返回類型:通常是運算符操作后的結果類型。

3 運算符重載函數的參數:根據運算符的類型,參數可以是一個或多個。

4??*?::?sizeof??:?.?注意以上5個運算符不能重載

3.1 代碼解析:

運算符重載成員函數代碼示例:

//成員函數 運算符重載
class Date 
{
public:int _x = 5;int _y = 4;int operator+(const Date& b){return this->_x + b._x + this->_y + b._y;}//錯誤寫法//int operator+(const Date& a , const Date& b)/*{return a.x + b.x + a.y + b.y;}*/
};
int main()
{//成員函數 運算符重載Date d1;Date d2;int sum = d1 + d2;std::cout << "d1 d2總和:" << sum << std::endl;return 0;
}

錯誤寫法分析:

因為它是Date類里面的成員函數 又因為成員函數會自帶一個隱含的this指針所以成員函數版本的 operator+ 只能有一個顯式參數。如果需要兩個參數,則應使用全局函數版本的運算符重載。

//全局函數 運算符重載
class Point
{
public://默認構造函數Point(){this->_x = 5;this->_y = 15;}
//private:int _x;int _y;
};
bool operator==(const Point& b, const Point& a)
{return (b._x == a._x) && (b._y == a._y);
}int main()
{Point f1;Point f2;int B = f1 == f2;std::cout << "1相同 0相否:" << B << std::endl;return 0;
}

全局函數的運算符重載是在類外部實現的,不屬于任何類,因此沒有 this 指針。全局函數可以通過參數訪問所有操作數。

假如我把成員函數變成私有的話那在全局函數里面就找不到他們了所以想改變就只能把運算符變量改為成員函數或者用友元函數或getter方法。

二 賦值運算符重載概念:

賦值運算符重載用于定義對象之間的賦值操作,即如何將一個對象的值賦給另一個對象。賦值運算符是 =,它在賦值時被調用。通常我們需要重載賦值運算符來處理深拷貝,以防止淺拷貝帶來的問題。

2.1 賦值運算符重載和拷貝構造的區別:

通過賦值運算符重載的概念我們知道它主要的功能是將一個對象的值賦給另一個對象,而這和拷貝構造又非常相似,然而賦值運算符重載與運算符重載只有兩字相差卻又是不同的內容,這就讓我很想知道他們之間的區別到底是什么,接下來讓我們一起來解密吧!

概念:

1. 賦值運算符重載

定義對象之間的賦值操作,即如何將一個對象的值賦給另一個對象。

2. 運算符重載:

定義或重新定義自定義類型的運算符行為,使其與內置類型的運算符行為一致。

3. 拷貝構造:

創建一個新的對象,并將其初始化為現有對象的副本。

區別:

拷貝構造函數和賦值運算符重載的主要區別在于它們的使用場景和目的。拷貝構造函數在對象創建時用于初始化新對象,目的是創建一個新的副本。賦值運算符重載在對象已存在時用于賦值操作,目的是修改現有對象的狀態,使其與另一個對象的狀態相同。拷貝構造函數通常接收一個對同類對象的常引用,而賦值運算符重載通常返回對象的引用,并接收一個對同類對象的常引用作為參數。而運算符重載和賦值運算符重載也真是差了兩個字而已,并沒有什么區別。

2.1.0 代碼解析:

//賦值運算符重載
class Date1
{
public://默認構造函數Date1(int year = 2005, int month = 5, int date = 25){this->_year = year;this->_month = month;this->_date = date;}//拷貝構造函數Date1(const Date1& other){this->_year = other._year;this->_month = other._month;this->_date= other._date;}//賦值運算符重載Date1 operator=(const Date1& d){this->_year = d._year;this->_month = d._month;this->_date = d._date;return *this;}//輸出void print(){std::cout << _year << "-" << _month << "-" << _date << std::endl;}private:int _year;int _month;int _date;
};int main()
{//構造函數Date1 q1(2024 , 7 , 12);Date1 q2(2021 , 6 , 26);//拷貝構造Date1 q3(q2);//賦值運算符重載Date1 q4;q4 = q1;//輸出q1.print();q2.print();q3.print();q4.print();return 0;
}

從上面代碼可以知道q3是在被創建的時候就直接被調用拷貝構造初始化而q4是先定義好之后在被調用賦值運算符重載初始化的。

那既然賦值運算符重載就是對象之間的賦值那和C語言中的賦值整體意思還是一樣的但就是賦值的對象變了,我不知道大家是否還記得在C語言中可以連續賦值,讓我們來試試在C++中的賦值運算符重載是否也可以實現呢?

#include <iostream>
class Date 
{
public:int _year, _month, _day;Date(int year = 2005, int month = 5, int day = 25){this->_year = year;this->_month = month;this->_day = day;}// 賦值運算符重載Date& operator=(const Date& d) {// 自賦值檢查if (this != &d) { _year = d._year;_month = d._month;_day = d._day;}return *this;   // 返回當前對象的引用}void Print(){std::cout << _year << "-" << _month << "-" << _day << std::endl;}
};int main() {Date d1(2023, 7, 10);Date d2;Date d3;// 鏈式賦值d3 = d2 = d1;d1.Print();  d2.Print(); d3.Print(); return 0;
}

輸出:

雖然輸出的結果確實是鏈式但是又有非常多的疑惑比如為什么要傳*this 還有執行順序是什么……

讓我們詳細的來解答一下:

首先d2傳給隱函數this指針然后d1傳給?Date& d那這時d1就是d的引用了,執行到下面就是判斷成員變量的地址是否相同(最開始它們之間的地址還是不一樣的)跳出循環之后就返回*this即d2的引用返回值類型??Date& (這個我之前一直沒看到所以就很困惑)

2.2 默認賦值運算符重載:

編譯器生成的默認賦值運算符重載也和默認構造函數中分自定義和內置類型那它與默認構造函數有什么區別,讓我們一探究竟吧

內置類型:

概念:編譯器生成的默認賦值運算符會直接逐字節拷貝內置類型成員變量的值。

代碼演示:

//默認賦值運算符重載(內置類型)
class Date1
{
public://默認構造函數Date1(int year = 2005, int month = 5, int date = 25){this->_year = year;this->_month = month;this->_date = date;}void print(){std::cout << _year << "-" << _month << "-" << _date << std::endl;}private:int _year;int _month;int _date;
};int main()
{Date1 q1(2024 , 7 , 12);Date1 q5;q5 = q1;q5.print();return 0;
}

輸出:

就如上圖所示,我并沒有寫賦值運算符重載但是它卻給我打印出和q1對象中的成員變量一樣的值,所以我們可以得出結論編譯器生成的默認賦值運算符會直接逐字節拷貝內置類型成員變量的值。俗稱淺拷貝。

自定義類型:

代碼演示:


//默認賦值運算符重載(自定義類型)
class Date2
{
public:// 賦值運算符重載Date2& operator=(const Date2& d){if (this != &d) { // 自我賦值檢查_a = d._a;}return *this;}private:int _a = 10;
};class Date3
{
public:// 默認構造函數Date3(int year = 2005, int month = 5, int date = 25){this->_year = year;this->_month = month;this->date = date;}void print(){std::cout << _year << "-" << _month << "-" << _date << std::endl;}private:int _year;int _month;int _date;Date2 c; // 包含 Date2 類型的成員變量
};int main()
{Date3 q1(2024, 7, 12);Date3 q5;q5 = q1; // 使用編譯器生成的默認賦值運算符q5.print();return 0;
}

輸出:

如圖所示編譯器生成的默認賦值運算符會調用自定義類型的賦值運算符重載。

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

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

相關文章

安全防御:防火墻基本模塊

目錄 一、接口 1.1 物理接口 1.2 虛擬接口 二、區域 三、模式 3.1 路由模式 3.2 透明模式 3.3 旁路檢測模式 3.4 混合模式 四、安全策略 五、防火墻的狀態檢測和會話表技術 一、接口 1.1 物理接口 三層口 --- 可以配置IP地址的接口 二層口&#xff1a; 普通二層…

Java面試題:分庫分表

分庫分表 當數據量非常大時,就需要通過分庫分表的方式進行壓力分攤,避免數據庫訪問壓力過大 分庫分表的前提: 業務數據達到一定量級:單表數據量達到1000w或20g 優化解決不了性能問題 分庫分表策略 垂直拆分 垂直分庫 以表為依據,根據業務將不同表拆分到不同庫中 eg:根…

車載終端_RTK定位|4路攝像頭|駕駛輔助系統ADAS定制方案

現代車輛管理行業的發展趨勢逐漸向智能化和高效化方向發展&#xff0c;車載終端成為關鍵的工具之一。在這個背景下&#xff0c;一款特別為車隊管理行業設計的車載終端應運而生。該車載終端采用8寸多點觸控電容屏&#xff0c;搭載聯發科四核處理器&#xff0c;主頻2.0GHz&#x…

如何安裝node.js

Node.js Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行時環境。 主要特點和優勢&#xff1a; 非阻塞 I/O 和事件驅動&#xff1a;能夠高效處理大量并發連接&#xff0c;非常適合構建高并發的網絡應用&#xff0c;如 Web 服務器、實時聊天應用等。 例如&#xff0c;在…

FeignClient詳解

FeignClient 是 Spring Cloud Open Feign 中的一個注解&#xff0c;它用于定義一個 Feign 客戶端&#xff0c;Feign 是一個聲明式的 Web 服務客戶端&#xff0c;使得編寫 Web 服務客戶端變得更加簡單。以下是 FeignClient 注解的詳細說明&#xff1a; 定義 Feign 客戶端&#x…

網絡安全——防御(防火墻)帶寬以及雙機熱備實驗

12&#xff0c;對現有網絡進行改造升級&#xff0c;將當個防火墻組網改成雙機熱備的組網形式&#xff0c;做負載分擔模式&#xff0c;游客區和DMZ區走FW3&#xff0c;生產區和辦公區的流量走FW1 13&#xff0c;辦公區上網用戶限制流量不超過100M&#xff0c;其中銷售部人員在其…

Swift入門筆記

Swift入門筆記 簡單值控制流函數和閉包對象和類枚舉和結構體并發協議和擴展錯誤處理泛型 簡單值 // 聲明變量 var myVariable 42 myVariable 50// 聲明常量 let myConstant 42// 聲明類型 let implicitInteger 70 let implicitDouble 70.0 let explicitDouble: Double 7…

排序相關算法--3.選擇排序

之前涉及的堆排序就是選擇排序的一種&#xff0c;先進行選擇。 基本選擇排序&#xff1a; 最簡單&#xff0c;也是最沒用的排序算法&#xff0c;時間復雜度高并且還是不穩定的排序方法&#xff0c;項目中很少會用。 過程&#xff1a; 在一個長度為 N 的無序數組中&#xff0c;…

智慧公廁系統助力城市衛生管理

在當今快速發展的城市環境中&#xff0c;城市衛生管理面臨著諸多挑戰。其中&#xff0c;公共廁所的管理一直是一個重要但又常被忽視的環節。然而&#xff0c;隨著科技的不斷進步&#xff0c;智慧公廁系統的出現為城市衛生管理帶來了全新的解決方案&#xff0c;成為提升城市品質…

OrangePi AIpro 淺上手

OrangePi AIpro 淺上手 OrangePi AIpro 介紹開發版介紹硬件規格頂層視圖和底層視圖接口詳情圖 玩轉 OrangePi AIPro燒錄鏡像串口調試連接 WiFissh 連接配置下載源 使用感受優點&#xff1a;缺點或需注意的點&#xff1a; OrangePi AIpro 介紹 開發版介紹 OrangePi AIpro是香橙…

【大語言模型】私有化搭建-企業知識庫-知識問答系統

下面是我關于大語言模型學習的一點記錄 目錄 人工智能學習路線 MaxKB 系統(基于大語言模型的知識問答系統) 部署開源大語言模型LLM 1.CPU模式(沒有好的GPU&#xff0c;算力和效果較差) 2.GPU模式&#xff08;需要有NVIDIA顯卡支持&#xff09; Ollama網絡配置 Ollama前…

【問卷系統】TDucKX更新速覽

TDuck是一款在線表單問卷收集工具&#xff0c;開源地址&#xff1a;https://gitee.com/TDuckApp一款免費的表單問卷系統&#xff1b;可快速創建問卷或業務表單&#xff0c;采用無代碼理念支持開發自定義組件。采用SpringBootVueElementUI技術棧&#xff0c;功能強大界面清新&am…

Catena-x標準解讀:CX-0007 Minimal Data Provider Service Offering v1.0.2 最小數據提供商服務產品

為了更好地理解&#xff0c;最小數據提供者服務也將被稱為“上傳工具”。 對于數據供應工具來說&#xff0c;數據主權的概念尤為重要。數據主權是Catena-X網絡的核心價值觀之一。每個參與者都應該盡可能多地控制自己的數據。這包括 他總是確切地知道他在與誰交換數據。參與者…

【GameFramework擴展應用】6-4、GameFramework框架增加AB包加解密功能

推薦閱讀 CSDN主頁GitHub開源地址Unity3D插件分享簡書地址QQ群:398291828大家好,我是佛系工程師☆恬靜的小魔龍☆,不定時更新Unity開發技巧,覺得有用記得一鍵三連哦。 一、前言 【GameFramework框架】系列教程目錄: https://blog.csdn.net/q764424567/article/details/1…

軟件測試面試200問(全)

1、B/S架構和C/S架構區別 B/S 只需要有操作系統和瀏覽器就行&#xff0c;可以實現跨平臺&#xff0c;客戶端零維護&#xff0c;維護成本低&#xff0c;但是個性化能力低&#xff0c;響應速度較慢 C/S響應速度快&#xff0c;安全性強&#xff0c;一般應用于局域網中&#xff0…

【matlab】智能優化算法優化BP神經網絡

目錄 引言 一、BP神經網絡簡介 二、智能優化算法概述 三、智能優化算法優化BP神經網絡的方法 四、蜣螂優化算法案例 1、算法來源 2、算法描述 3、算法性能 結果仿真 代碼實現 引言 智能優化算法優化BP神經網絡是一個重要的研究領域&#xff0c;旨在通過智能算法提高…

變量篩選—特征包含信息量

在變量篩選中,通過衡量特征所包含信息量大小,決定是否刪除特征,常用的指標有單一值占比、缺失值占比和方差值大小。單一值或缺失值占比越高,表示特征包含信息量越少,不同公司設置不同閾值,一般單一值、缺失值占比高于95%,建議刪除。方差值越小,代表特征包含信息量越小。…

入職前回顧一下git-01

git安裝 Linux上安裝git 在linux上建議用二進制的方式來安裝git&#xff0c;可以使用發行版包含的基礎軟件包管理工具來安裝。 紅帽系 sudo yum install gitDebian系 sudo apt install gitWindows上安裝git 去官網下載和操作系統位數相同的安裝包.或者可以直接安裝GitHub…

模板引擎是什么?

模板引擎&#xff08;Template Engine&#xff09;是一種用于生成文本輸出的工具&#xff0c;尤其在Web開發中應用廣泛。它的主要目的是將用戶界面&#xff08;通常是HTML等模板文件&#xff09;與業務數據&#xff08;內容&#xff09;分離&#xff0c;從而提供一種高效、靈活…

[圖解]SysML和EA建模住宅安全系統-14-黑盒系統規約

1 00:00:02,320 --> 00:00:07,610 接下來&#xff0c;我們看下一步指定黑盒系統需求 2 00:00:08,790 --> 00:00:10,490 就是說&#xff0c;把這個系統 3 00:00:11,880 --> 00:00:15,810 我們的目標系統&#xff0c;ESS&#xff0c;看成黑盒 4 00:00:18,030 --> …