類和對象——【運算符重載】

P. S.:以下代碼均在VS2019環境下測試,不代表所有編譯器均可通過。
P. S.:測試代碼均未展示頭文件iostream的聲明,使用時請自行添加。

??

在這里插入圖片描述

???????????????????????????????????????????博主主頁:Yan. yan.
??????????????????? ??????????????????????????C語言專欄
????????????????????????????????????????????數據結構專欄
?????????????????????????????????????????力扣牛客經典題目專欄
?????????????????????????????????????????????????????C++專欄

1、 運算符重載

??C++為了增強代碼的可讀性引入了運算符重載,運算符重載是具有特殊函數名的函數,也具有其返回值類型,函數名字以及參數列表,其返回值類型與參數列表與普通的函數類似。

??函數名字為:關鍵字operator后面接需要重載的運算符符號。
??函數原型:返回值類型 operator操作符(參數列表)

以等號為例:

返回類型 operator=(類型 參數1, 類型 參數2{
}

注意:

  • 不能通過連接其他符號來創建新的操作符:比如operator@
  • 重載操作符必須有一個類類型參數
  • 用于內置類型的運算符,其含義不能改變,例如:內置的整型+,不 能改變其含義
  • 作為類成員函數重載時,其形參看起來比操作數數目少1,因為成員函數的第一個參數為隱
    藏的this
  • " .* ", " :: ", " sizeof ", " ?: ", " . " 注意以上5個運算符不能重載。這個經常在筆試選擇題中出現。.

2、重載運算符的使用

??在全局使用重載運算符時,以==為例:

bool operator==(Data& a1, Data& a2)
{return a1._year == a2._year && a1._month == a2._month && a1._day == a2._day;
}

在這里插入圖片描述
??但是在使用的時候卻發生了報錯,這是因為類中的成員變量是私有的,被保護起來了,不可以直接去訪問,所以,我們可以將重載函數放入類域中,將其變成類的成員函數

在這里插入圖片描述


運算符重載函數的調用:
int main()
{Data a1(2024, 7, 10);Data a2(2024, 7, 11);cout << (a1 == a2) << endl;a1.Print();a2.Print();return 0;
}

3、賦值重載運算符

賦值運算符重載格式

  • 參數類型:const T&,傳遞引用可以提高傳參效率
  • 返回值類型:T&,返回引用可以提高返回的效率,有返回值目的是為了支持連續賦值
  • 檢測是否自己給自己賦值
  • 返回*this :要復合連續賦值的含義
Data& operator=(const Data& d){if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;}

??其中有關參數類型有兩種不同寫法,一種是寫為Date,另一種是寫為Date&,其主要使用場景為:

  • 若在函數調用生命周期結束時,返回的對象沒有被銷毀,則使用引用返回 “ Date& ”。
  • 若在函數調用生命周期結束時,返回的對象被銷毀了(即局部變量),則使用傳值返回。


    傳值返回
    ??在C++中,當函數調用結束時,如果返回的是局部變量,那么所返回的值并不直接是局部變量的值,而是局部變量的臨時拷貝,當函數調用結束時,局部變量被銷毀,而臨時變量并沒有被銷毀,而作為返回值傳遞給了接受值,例如:
Data Func()
{Data a1(2024, 7, 10);return a1;
}int main()
{Data a2(Func());a2.Print();return 0;
}

??如果函數調用中所返回的變量是局部變量,如果使用引用的方式來接收會怎么樣呢?
在這里插入圖片描述
??此時出現了錯誤,這是因為臨時變量作為編譯器所創建的變量,不可以被修改,正確的寫法如下:
在這里插入圖片描述


引用返回
??引用返回時,是將函數內的變量的別名返回,并使用引用的方式接收。

Data& Func(Data& a)
{Data& a2 = a;return a2;
}int main()
{Data a1(2024, 7, 10);Data& a2 = Func(a1);a2.Print();return 0;
}

賦值運算符只能重載成類的成員函數不能重載成全局函數

在這里插入圖片描述
??原因:賦值運算符如果不顯式實現,編譯器會生成一個默認的。此時用戶再在類外自己實現一個全局的賦值運算符重載,就和編譯器在類中生成的默認賦值運算符重載沖突了,故賦值運算符重載只能是類的成員函數。

用戶沒有顯式實現時,編譯器會生成一個默認賦值運算符重載,以值的方式逐字節拷貝。

??注意:內置類型成員變量是直接賦值的,而自定義類型成員變量需要調用對應類的賦值運算符重載完成賦值。

class Time
{
public:Time(){_hour = 1;_minute = 1;_second = 1;}Time& operator=(const Time& t){if (this != &t){_hour = t._hour;_minute = t._minute;_second = t._second;}return *this;}
private:int _hour;int _minute;int _second;
};
class Date
{
private:// 基本類型(內置類型)int _year = 1970;int _month = 1;int _day = 1;// 自定義類型Time _t;
};int main()
{Date d1;Date d2;d1 = d2;return 0;
}

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

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

相關文章

【vueUse庫Reactivity模塊各函數簡介及使用方法--中篇】

vueUse庫是一個專門為Vue打造的工具庫,提供了豐富的功能,包括監聽頁面元素的各種行為以及調用瀏覽器提供的各種能力等。其中的Browser模塊包含了一些實用的函數,以下是這些函數的簡介和使用方法: vueUse庫Sensors模塊各函數簡介及使用方法 vueUseReactivity函數1. reactiv…

宏任務與微任務對比【前端異步】

目錄 簡介微任務與宏任務的基本概念宏任務&#xff08;Macrotasks&#xff09;微任務&#xff08;Microtasks&#xff09;宏任務示例微任務示例微任務與宏任務的執行時序 結論 簡介 在JavaScript的異步編程中&#xff0c;理解事件循環&#xff08;Event Loop&#xff09;是至關…

Autogen和Crewai的對比

AutoGen和CrewAI是兩種用于開發人工智能Agent應用的框架&#xff0c;各有其獨特的特性和優勢。以下是對這兩者的詳細對比&#xff1a; 共同點 編程語言&#xff1a;兩者都使用Python編程語言。應用領域&#xff1a;都用于創建人工智能Agent應用程序。多代理對話&#xff1a;都…

Qt+MySQL實現社團管理系統

開發環境 ● Qt 5.14.1 ● Win10 ● Mysql 5.7.28 系統介紹 系統主要實現的功能如下圖所示 社團管理系統主要包含了以下幾個亮點功能 輪播圖顯示社團信息支持excel形式的導入導出學生信息權限控制&#xff08;管理員、超級管理員、用戶&#xff09; 系統效果展示 登錄界面…

AI學習指南機器學習篇-層次聚類合并策略

AI學習指南機器學習篇-層次聚類合并策略 在機器學習領域&#xff0c;層次聚類&#xff08;Hierarchical Clustering&#xff09;是一種常用的聚類方法&#xff0c;它通過不斷合并相似的聚類來構建聚類層次結構。在層次聚類中&#xff0c;聚類合并策略是非常關鍵的一環&#xf…

前端工程化(01):Webpack、Gulp、Grunt三大自動化構建工具對比

10年前端開發和UI設計老司機→貝格前端工場&#xff0c;為您分享。本期介紹三款自動化構建工具&#xff0c;看看他們的工作原理和差異化&#xff0c;幫助你來選擇。 Webpack、Gulp和Grunt都是前端構建工具&#xff0c;用于優化前端開發流程和提高開發效率。它們都可以自動化執…

c++ 的(引用)和*(指針)

在C中&#xff0c;&&#xff08;引用&#xff09;和*&#xff08;指針&#xff09;在函數參數中的使用有各自的特點和用途。下面是它們的具體使用方式以及它們之間的一些區別&#xff1a; 引用&#xff08;&&#xff09; 使用方式: 引用作為函數參數時&#xff0c;可…

Java8新語法

一、Java8新特性 JDK 8 正式版在 2013 年 9 月份發布。 Java8主要內容Lambda表達式函數式接口方法引用與構造器引用Stream API接口中的默認方法與靜態方法新時間日期API其他新特性Java8新特性簡介: 速度更快代碼更少(增加了新的Lambda表達式)強大的Stream API便于并行最大化減少…

c++棧內存和堆內存的基本使用

c棧內存和堆內存的基本使用 #include <iostream>// 定義一個簡單的結構體 struct Person {std::string name;int age; };int main() {// 棧內存分配int a 10; // 基本數據類型的棧內存分配Person person; // 結構體的棧內存分配person.name "John";person.a…

構建未來對話:從零開始實現基于Vue 3的AI聊天頁面

大家好&#xff0c;今天我們將一起探索如何從零開始&#xff0c;使用Vue 3構建一個AI對話頁面。這個過程不僅會讓我們了解Vue 3的新特性&#xff0c;還會讓我們對構建交互式Web應用有一個全新的認識。如果你是編程新手&#xff0c;別擔心&#xff0c;我會用通俗易懂的語言&…

【Linux命令基礎】vim的簡介

文章目錄 前言如何在Ubuntu中安裝VimVim的作用Vim的優勢vim的模式總結前言 在Linux環境中,我們經常需要編輯文本文件,無論是編寫代碼,還是修改配置文件。而在這些場景中,Vim編輯器無疑是我們的得力助手。Vim是從vi發展出來的一個文本編輯器,代碼補全、編譯及錯誤跳轉等方…

HarmonyOS(43) @BuilderParam標簽使用指南

BuilderParam BuilderParam使用舉例定義模板定義具體實現BuilderParam初始化 demo源碼參考資料 BuilderParam 該標簽有的作用有點類似于設計模式中的模板模式&#xff0c;類似于指定一個UI占位符&#xff0c;具體的實現交給具體的Builder&#xff0c;顧名思義&#xff0c;可以…

SpringBoot項目架構實戰之“網關zuul搭建“

第三章 網關zuul搭建 前言&#xff1a; 1、主要功能 zuul主要提供動態路由&#xff08;內置ribbon實現&#xff09;和過濾&#xff08;可以做統一鑒權過濾器、灰度發布過濾器、黑白名單IP過濾器、服務限流過濾器&#xff08;可以配合Sentinel實現&#xff09;&#xff09;功能…

學會創建虛擬網卡

此電腦-----管理 一直點擊下一頁 選擇網絡適配器 選擇Microsoft----Microsoft KM-TEST環回適配器 然后點擊下一頁 完成的界面如下&#xff1a; 手動改IP

Git分支結構

目錄 1. 線性分支結構 2. 分叉與合并結構 3. 分支與標簽的關系 4. 并行開發與分支管理策略 測試&#xff08;本機系統為Rocky_linux9.4&#xff09; 合并失敗解決 刪除分支 刪除本地分支 刪除遠程分支 Git 中的分支結構是版本控制中非常重要的概念之一&#xff0c;它描…

政安晨:【Keras機器學習示例演繹】(五十四)—— 使用神經決策森林進行分類

目錄 導言 數據集 設置 準備數據 定義數據集元數據 為訓練和驗證創建 tf_data.Dataset 對象 創建模型輸入 輸入特征編碼 深度神經決策樹 深度神經決策森林 實驗 1&#xff1a;訓練決策樹模型 實驗 2&#xff1a;訓練森林模型 政安晨的個人主頁&#xff1a;政安晨 歡…

Python | Leetcode Python題解之第228題匯總區間

題目&#xff1a; 題解&#xff1a; class Solution:def summaryRanges(self, nums: List[int]) -> List[str]:def f(i: int, j: int) -> str:return str(nums[i]) if i j else f{nums[i]}->{nums[j]}i 0n len(nums)ans []while i < n:j iwhile j 1 < n …

Codeforces Round #956 (Div. 2) and ByteRace 2024 E. I Love Balls(概率期望)

題目 思路來源 官方題解 題解 特殊球不會改變普通球的順序&#xff0c;所以都是alice拿一半里較多的部分 n-k1一半向上取整就是(n-k2)/2&#xff0c;同理n-k個一般向上取整(n-k1)/2 每個特殊球獨立地來看&#xff0c;在每個空隙的概率相同 所以分別統計特殊球和非特殊球的…

LLM+Agent技術

&#x1f4a1; Agent可以理解為某種能自主理解、規劃決策、執行復雜任務的智能體。Agent 是讓 LLM 具備目標實現的能力&#xff0c;并通過自我激勵循環來實現這個目標。它可以是并行的&#xff08;同時使用多個提示&#xff0c;試圖解決同一個目標&#xff09;和單向的&#xf…

14-63 劍和詩人37 - 分布式系統中的數據訪問設計

?? 在分布式系統中,跨服務和數據庫提供統一、可靠的數據訪問至關重要,但又極具挑戰性。微服務和數據庫的拓撲結構為分布、緩存、復制和同步帶來了復雜性。 讓我們探索有助于解決這些復雜性并簡化構建強大、高性能分布式系統的常見數據訪問模式。 概述 我們將通過示例介紹…