C++8--賦值運算符重載

1.運算符重載

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

函數名字為:關鍵字operator后面接需要重載的運算符符號

函數原型:返回值類型operator操作符(參數列表)

注意:

  • 不能通過連接其他符號來創建新的操作符:比如operator@
  • 重載操作符必須有一個類類型參數
  • 用于內置類型的操作符,其含義不能改變,比如:內置的整型+,不能改變其含義
  • 作為類成員函數重載時,其形參看起來比操作數數目少1,因為成員函數的第一個參數為隱藏的this
  • .*? ?::? sizeof? ??:? ? .? ?注意以上五個運算符不能重載
class Date
{
public:Date(int year = 2024, int month = 12,int day = 16){_year = year;_month = month;_day = day;}
//private:int _year;int _month;int _day;
};//這里我們會發現運算符重載成全局的就需要成員變量是公有的
//我們有兩個解決方案:1.友元解決2.重載成成員函數
bool operator==(const Date& d1,const Date& d2)//這里是有問題的,在后面一個代碼會說
{return d1._year == d2._year&& d1._month == d2._month&& d1._day == d2._day;
}int main()
{Date d1(2024, 12, 17);Date d2(2024, 12, 18);cout << (d1 == d2) << endl;
}
class Date
{
public:Date(int year = 2024, int month = 12, int day = 16){_year = year;_month = month;_day = day;}bool operator==(const Date& d2)//看似只有一個形參,而實際有兩個形參,{                              //那個看不見的形參就是this指針,return _year == d2._year   //左操作數是this,指向調用函數的對象&& _month == d2._month&& _day == d2._day;}private:int _year;int _month;int _day;
};

2.賦值運算符重載

1賦值運算符重載格式

  • 參數類型:const (類)& ,傳遞引用可以提高傳參的效率
  • 返回值類型:(類)&,返回引用可以提供返回的效率,有返回值目的是為了支持連續賦值
  • 檢測是否自己給自己賦值
  • 返回*this:要復合連續賦值的含義
class Date
{
public:Date(int year = 2024, int month = 12, int day = 15){_year = year;_month=month;_day = day;}Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;}Date& operator=(const Date& d){if (this != &d){_year = d._month;_month = d._month;_day = d._day;}return *this;}
private:int _year;int _month;int _day;
};int main()
{Date d1(2000,12,12);Date d2 = d1;return 0;
}

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

class Date
{
public:Date(int year = 2024, int month = 12, int day = 15){		_year = year;_month=month;_day = day;}
//private:int _year;int _month;int _day;
};//賦值運算符重載成全局函數,注意重載成全局函數時沒有this指針了,需要給兩個參數
Date& operator=(Date& left, const Date& right)
{if (&left != &right){left._year = right._year;left._month = right._month;left._day = right._day;}return left;
}
//編譯錯誤:
//"operator="必須是非靜態成員

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

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

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

默認生成賦值重載跟拷貝構造行為一樣:
1、內置類型成員--值拷貝/淺拷貝

2、自定義類型成員會去調用他的賦值重載

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 = 2024;int _month = 12;int _day = 16;//自定義類型:Time _t;
};int main()
{Date d1;Date d2;d1 = d2;return 0;
}

既然編譯器生成的默認賦值運算符重載函數已經可以完成字節序的值拷貝了,還需要自己實現嗎?那是當然的,畢竟淺拷貝無法正確處理資源管理的情況。

typedef int DataType;
class Stack
{
public:Stack(int capacity = 10){_a = (DataType*)malloc(sizeof(DataType) * capacity);if (_a == nullptr){perror("malloc::fail");return;}_capacity = capacity;_size = 0;}void Push(const DataType& data){_a[_size++] = data;}~Stack(){if (_a){free(_a);_a = nullptr;_capacity = 0;_size = 0;}}private:DataType* _a;int _size;int _capacity;
};int main()
{Stack s1;s1.Push(1);s1.Push(2);s1.Push(3);s1.Push(4);Stack s2;s2 = s1;return 0;
}

注意:如果類中未涉及到資源管理,賦值運算符是否實現都可以;一旦涉及到資源管理則必須要實現。

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

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

相關文章

P1255 數樓梯

剛開始使用暴力進行求解&#xff0c;結果發現這是一道考驗高精度的題目&#xff0c;后來用高精度的方法&#xff0c;甚至使用到了容器&#xff0c;結果還不如暴力求解的60分&#xff0c;后來看了題解&#xff0c;有一個非常好的思路&#xff0c;即體現了高精度求和&#xff0c;…

pyfink1.20版本下實現消費kafka中數據并實時計算

1、環境 JDK版本&#xff1a;1.8.0_412python版本&#xff1a;3.10.6apache-flink版本&#xff1a;1.20.0flink版本&#xff1a;1.20kafka版本&#xff1a;kafka_2.12-3.1.1flink-sql-connector-kafka版本&#xff1a;3.3.0-1.202、執行python-flink腳本 從kafka的demo獲取消…

數據結構速成

1. 數據結構與算法 2. 順序表 3. 鏈表 4. 棧與隊列 5. 串 6. 樹與二叉樹&#xff08;1&#xff09; 7. 樹與二叉樹&#xff08;2&#xff09; 8. 圖 9. 圖的應用 10. 查找 11. 排序&#xff08;1&#xff09; 12. 排序&#xff08;2&#xff09;

k8s的污點與容忍度

污點&#xff08;Taint&#xff09;針對節點來說&#xff0c;和節點親和性正好相對&#xff0c;節點親和性使Pod被吸引到一類特定的節點&#xff0c;而污點則使節點能夠排斥一類特定的Pod。 容忍度&#xff08;Toleration&#xff09;應用于Pod上&#xff0c;它用來允許調度器…

how to write 述職pptx as a tech manager

As a technical manager, crafting an effective 述職 (performance review) PPT requires you to highlight your leadership, team accomplishments, technical contributions, challenges faced, and future plans. Heres a structured approach to design your PPT: 1. Cov…

從源碼層級深入探索 Spring AMQP 如何在 Spring Boot 中實現 RabbitMQ 集成——消費者如何進行消費

本章節主要從底層源碼探索Spring Boot中RabbitMQ如何進行消費&#xff0c;至于RabbitMQ是如何使用如何生產消息&#xff0c;本章不做過多介紹&#xff0c;感興趣的小伙伴可以參考&#xff1a;從源碼層級深入探索 Spring AMQP 如何在 Spring Boot 中實現 RabbitMQ 集成——生產者…

計算機視覺中的邊緣檢測算法

摘要&#xff1a; 本文全面深入地探討了計算機視覺中的邊緣檢測算法。首先闡述了邊緣檢測的重要性及其在計算機視覺領域的基礎地位&#xff0c;隨后詳細介紹了經典的邊緣檢測算法&#xff0c;包括基于梯度的 Sobel 算子算法、Canny 邊緣檢測算法等&#xff0c;深入剖析了它們的…

Unix 和 Windows 的有趣比較

Unix 和 Windows NT 比較 來源于這兩本書&#xff0c;把兩本書對照來讀&#xff0c;發現很多有意思的地方&#xff1a; 《Unix 傳奇》 https://book.douban.com/subject/35292726/ 《觀止 微軟創建NT和未來的奪命狂奔 》 Showstopper!: The Breakneck Race to Create Windows…

SSM 垃圾分類系統——高效分類的科技保障

第五章 系統功能實現 5.1管理員登錄 管理員登錄&#xff0c;通過填寫用戶名、密碼、角色等信息&#xff0c;輸入完成后選擇登錄即可進入垃圾分類系統&#xff0c;如圖5-1所示。 圖5-1管理員登錄界面圖 5.2管理員功能實現 5.2.1 用戶管理 管理員對用戶管理進行填寫賬號、姓名、…

系列1:基于Centos-8.6部署Kubernetes (1.24-1.30)

每日禪語 “木末芙蓉花&#xff0c;山中發紅萼&#xff0c;澗戶寂無人&#xff0c;紛紛開自落。?”這是王維的一首詩&#xff0c;名叫《辛夷塢》?。這首詩寫的是在辛夷塢這個幽深的山谷里&#xff0c;辛夷花自開自落&#xff0c;平淡得很&#xff0c;既沒有生的喜悅&#xff…

Y20030004基于asp.net+Sql的環保網站的設計與實現(附源碼 調試 文檔)

環保網站的設計與實現 1.摘要要2. 系統功能3.功能結構圖4.界面展示5.源碼獲取 1.摘要要 近幾年國家對于環境管理是高度重視&#xff0c;尤其是對于環境生態的破壞與環境污染&#xff0c;已經嚴重影響到人類的生存和發展。為了使生態環境能夠得到保護和改善&#xff0c;持續發展…

安全計算環境-(一)路由器-1

安全計算環境-網絡設備 安全管理中心針對整個系統提出了安全管理方面的技術控制要求&#xff0c;通過技術手段實現集中管理&#xff1b;涉及的安全控制點包括系統管理、審計管理、安全管理和集中管控。以下以三級等級保護對象為例&#xff0c;描述安全管理中心各個控制要求項的…

D9741是一塊脈寬調制方三用于也收路像機和筆記本電的等設備上的直流轉換器。在便攜式的儀器設備上。

概述&#xff1a; D9741是一塊脈寬調制方三用于也收路像機和筆記本電的等設備上的直流轉換器。在便攜式的儀器設備上。 主要特點&#xff1a; ● 高精度基準電路 ● 定時閂鎖、短路保護電路 ● 低電壓輸入時誤操作保護電路 ● 輸出基準電壓(2.5V) ● 超過工作范圍能進行自動校…

數據挖掘之聚類分析

聚類分析&#xff08;Clustering Analysis&#xff09; 是數據挖掘中的一項重要技術&#xff0c;旨在根據對象間的相似性或差異性&#xff0c;將對象分為若干組&#xff08;簇&#xff09;。同一簇內的對象相似性較高&#xff0c;而不同簇間的對象差異性較大。聚類分析廣泛應用…

Qt 圖形框架下圖形拖動后位置跳動問題

在使用Qt 的圖形框架QGraphicsScene&#xff0c;QGraphicsView實現圖形顯示時。遇到一個很棘手的BUG。 使用的圖形是自定義的QGraphicsObject的子類。 現象是將圖形添加到畫布上之后&#xff0c;用鼠標拖動圖形&#xff0c;圖形能正常改變位置&#xff0c;當再次用鼠標點擊圖…

Vue技術中參數傳遞:Props與事件的實踐指南

在Vue.js中&#xff0c;組件間的參數傳遞是構建動態和交互式應用的核心。本文將深入探討如何通過Props和事件&#xff08;$emit&#xff09;在Vue組件間進行參數傳遞&#xff0c;并提供代碼示例。 Props傳遞數據 Props是Vue中組件間傳遞數據的一種方式&#xff0c;它允許父組…

一、LRU緩存

LRU緩存 1.LRU緩存介紹2.LRU緩存實現3.LRU緩存總結3.1 LRU 緩存的應用3.2 LRU 緩存的優缺點 1.LRU緩存介紹 LRU是Least Recently Used 的縮寫&#xff0c;意為“最近最少使用”。它是一種常見的緩存淘汰策略&#xff0c;用于在緩存容量有限時&#xff0c;決定哪些數據需要被刪…

LabVIEW光柵衍射虛擬仿真系統

隨著現代教育技術的快速發展&#xff0c;虛擬仿真實驗平臺逐漸成為物理實驗教學的重要輔助工具。基于LabVIEW的平面透射光柵虛擬仿真系統幫助學生更好地理解和分析光柵衍射現象&#xff0c;提高教學質量和學生的學習興趣。 項目背景 在波動光學的教學中&#xff0c;光柵衍射實…

241211 selenium問題記錄

The process started from chrome location /usr/bin/chromedriver is no longer running, so ChromeDriver is assuming that Chrome has crashed. 聲明option類 chrome_option.add_argument(--headless) 后臺啟動webdriver NoSuchDriverException(msg) from err selenium.c…

前端核心知識總結

?前端架構知識總結?主要包括以下幾個方面&#xff1a; ?HTML?&#xff1a;HTML是構建網頁的基礎&#xff0c;使用各種標簽定義網頁的結構&#xff0c;如<html>、<head>、<body>等。HTML5引入了新的語義化標簽&#xff0c;如<article>、<section…