C++面向對象學習筆記五

本文主要講解運算符重載,由于白鳯大佬沒有具體講解,所以本文自行補充了運算符重載的相關知識

目錄

文章目錄

前言

運算符重載

加號運算符重載

左移運算符重載

遞增運算符重載?

總結


前言

本文主要對于運算符重載進行探討,分別對于成員函數重載和全局函數重載(友元函數重載)進行討論。


運算符重載

運算符重載是C++中的一項強大功能,它允許您為自定義的類或結構體定義特定的行為,以響應與內置類型相似的操作符。通過重載運算符,您可以實現自定義類型之間的數學運算、比較、位操作等。

運算符重載使用operator關鍵字后跟要重載的運算符來實現。例如,+表示加法運算符,-表示減法運算符等。

運算符重載一般分為成員函數重載和全局函數重載

以下是一些常見的需要進行運算符重載的情況:

  1. 算術運算符:例如?+,?-,?*,?/,?%
  2. 比較運算符:例如?==,?!=,?<,?>,?<=,?>=
  3. 賦值運算符:例如?=,?+=,?-=,?*=,?/=
  4. 位操作運算符:例如?&,?|,?^
  5. 下標操作符:[]
  6. 函數調用操作符:()

對于每個需要進行重載的運算符,您可以根據需求定義適當的成員函數或非成員函數。成員函數形式在對象本身上調用該操作,而非成員函數形式將兩個對象作為參數傳遞。

請注意,在進行運算符重載時,請遵循一些最佳實踐和規則:

  1. 不要改變原始對象的狀態(如果不是必要的)。
  2. 避免創建歧義或混亂的重載操作。
  3. 考慮使用友元函數來實現某些運算符重載,以便訪問私有成員。

運算符重載是C++語言中的一項強大功能,可以提高代碼的可讀性和表達能力。

加號運算符重載

加號運算符(+)可以在C++中進行重載,使其適用于自定義類型的對象。要重載加號運算符,您可以使用成員函數或非成員函數的形式。

成員函數形式:本質為 p3 = p1.operator+(p2)

class MyClass {
public:MyClass operator+(MyClass& other) {// 在這里實現加法操作,并返回結果}
};
#include <iostream>class Complex {
private:double real;double imag;public:Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}Complex operator+(const Complex& other) const {return Complex(real + other.real, imag + other.imag);}void display() const {std::cout << "(" << real << " + " << imag << "i)" << std::endl;}
};int main() {Complex c1(2.5, 3.7);Complex c2(1.8, -2.9);Complex sum = c1 + c2; // 使用重載的加號運算符sum.display(); // 輸出:(4.3 + 0.8i)return 0;
}

全局函數形式:(友元函數訪問私有成員)本質為 p3 = operator+(p1,p2)

class MyClass {
public:};MyClass operator+(const MyClass& obj1, const MyClass& obj2) {// 在這里實現加法操作,并返回結果}
#include <iostream>class Complex {
private:double real;double imag;public:Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}// 聲明友元函數以便訪問私有成員friend Complex operator+(const Complex& c1, const Complex& c2);void display() const {std::cout << "(" << real << " + " << imag << "i)" << std::endl;}
};Complex operator+(const Complex& c1, const Complex& c2) {return Complex(c1.real + c2.real, c1.imag + c2.imag);
}int main() {Complex c1(2.5, 3.7);Complex c2(1.8, -2.9);Complex sum = c1 + c2; // 使用重載的加號運算符sum.display(); // 輸出:(4.3 + 0.8i)return 0;
}

倆個代碼實現內容一樣,主要一個是成員函數,一個全局函數,全局函數需要成為友元函數來訪問類的私有數據成員。?

同時運算符重載也可以發生函數重載?

左移運算符重載

如果我們有一個person類,建立一個對象p,當我們想直接使用cout<<p<<endl;來輸出對象p中的內容似乎并不能直接實現,C++并不認識這個類,也不知道如何輸出。

這里我們就可以使用左移運算符重載了,與上面的加號運算符一樣,左移運算符同樣是以operato<<形式實現的,這里我們仍然可以分為成員函數重載和全局函數重載來分別實現一下。

當我們按照成員函數來寫時,就會發現一個問題,首先你不能給自己傳入p,即p.operator<<(p),然后我們再使用p.operator<<(cout),而這樣簡化的版本就是p<<cout,與我們想要的cout<<p相反了,所以我們不使用成員函數來實現左移運算符,而使用全局函數。

void operator<<(cout)
{
//簡化完事 p << cout
}

?如果用全局函數首先要知道的事,cout是輸出流對象,即ostream對象

使用operator<<(ostream &cout,person &p)進行函數重載,簡化完事cout<<p

至于為什么不用void空值,而是ostream &,是因為,當你主函數使用函數重載輸出后,如果返回的事空值,就不能繼續追加輸出,例如<<endl;補上換行,因為cout后面一直能連續使用<<是鏈式編程,需要返回的還是cout,即返回ostream輸出流。

class preson 
{
private: 
string p_name;
int p_age;
public:
friend ostream & operator<<(ostream &cout,person &p);
}
ostream & operator<<(ostream &cout,person &p)
{cout<<"p_name"<<p.p_name<<"p_age"<<p._age<<endl;
}

遞增運算符重載?

遞增運算符重載,即要對++進行運算符重載

跟C++中的++a,a++一樣,遞增運算符重載也要分為前置遞增和后置遞增的重載

解決下述代碼中幾個重點問題

1、函數重載的返回類型就是自己建立的Integer類型是因為,如果有個對象num,當你想要實現對num++或者++num直接輸出,類似于a=1;cout<<a++<<endl;的操作時,你需要返回Integer類型,否則返回空值是沒有輸出的

2、為什么前置遞增返回值類型引用了,而后置遞增返回值類型沒有引用。

后置傳遞如果使用引用,那么值就錯了,要返回遞增前的值

這個主要是了解++運算符實現的本質
a=1;

cout<<++(++a)<<endl;? 這個是對的,說明前置運算符計算本質是引用,對一個數修改

cout<<(a++)++<<endl;? 這個是錯的,說明后置運算符計算本質是值傳遞,無法二次修改

3、下述代碼偷懶了,應該演示一下++num,num++的輸出,而不是使用成員函數getValue來實現,其實只要將左移運算符重載一下就可以了,按照已講過的方法實現即可?

#include <iostream>
using namespace std;class Integer {
private:int value;
public:Integer(int val) : value(val) {}// 前置遞增運算符重載Integer& operator++() {++value;return *this;}// 后置遞增運算符重載Integer operator++(int) {Integer temp(value);++value;return temp;}int getValue() const {return value;}
};int main() {Integer num1(5);cout << "初始值: " << num1.getValue() << endl;// 前置遞增++num1;cout << "前置遞增后的值: " << num1.getValue() << endl;// 后置遞增Integer num2 = num1++;cout << "后置遞增后的值: " << num2.getValue() << endl;cout << "num1當前的值: " << num1.getValue() << endl;return 0;
}

總結

本文主要對運算符重載進行了探討,主要講述了運算符重載分為成員函數重載和全局函數重載(友元函數重載)這樣的操作,并舉例加號,左移以及遞增運算符的重載方法和一些注意事項。

通過上述的講解,可以實現更多的運算法重載的方法,當然還有很多運算符重載值得我們探討,本文講述的內容也比較有限。

推薦學習博客?https://xxetb.xetslk.com/s/4GgGz6

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

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

相關文章

JVM 類加載機制

JVM 類加載機制分為五個部分&#xff1a;加載&#xff0c;驗證&#xff0c;準備&#xff0c;解析&#xff0c;初始化&#xff0c;下面我們就分別來看一下這五個過程。 加載 加載是類加載過程中的一個階段&#xff0c;這個階段會在內存中生成一個代表這個類的 java.lang.class 對…

C語言經典例題-9

1.簡單計算器 題目描述&#xff1a; KK實現一個簡單計算器&#xff0c;實現兩個數的“加減乘除”運算&#xff0c;用戶從鍵盤輸入算式“操作數1運算符操作數2”&#xff0c;計算并輸出表達式的值&#xff0c;如果輸入的運算符號不包括在&#xff08;、-、*、/&#xff09;范圍…

Navicat Premium安裝pojie版

下載、安裝mysql&#xff0c;環境變量配置 1、官網下載mysql&#xff1a;https://www.mysql.com/downloads/ 下載成功&#xff0c;進行安裝 一直點下一步 驗證&#xff0c;開始中搜索mysql 說明安裝成功 環境變量配置 默認安裝路徑C:\Program Files\MySQL …

向量檢索和關鍵字檢索的區別?

向量檢索&#xff08;Vector Retrieval&#xff09;和關鍵字檢索&#xff08;Keyword Retrieval&#xff09;是信息檢索領域中常見的兩種檢索方法&#xff0c;它們有一些顯著的區別&#xff1a; 1、檢索方式&#xff1a; 向量檢索&#xff1a;向量檢索是基于文檔和查詢之間的相…

Kafka和Spark Streaming的組合使用學習筆記(Spark 3.5.1)

一、安裝Kafka 1.執行以下命令完成Kafka的安裝&#xff1a; cd ~ //默認壓縮包放在根目錄 sudo tar -zxf kafka_2.12-2.6.0.tgz -C /usr/local cd /usr/local sudo mv kafka_2.12-2.6.0 kafka-2.6.0 sudo chown -R qiangzi ./kafka-2.6.0 二、啟動Kafaka 1.首先需要啟動K…

計算機畢業設計Python地震預測系統 地震數據分析可視化 地震爬蟲 大數據畢業設計 Flink Hadoop 深度學習 機器學習 人工智能 知識圖譜

學生信息 姓名&#xff1a;  祁浩 題目&#xff1a; 基于Python的中國地震數據分析與可視化系統的設計與實現 學號&#xff1a; 2020135211 班級&#xff1a; 20大數據本科2班 指導教師&#xff1a; 劉思思 答辯過程 學生開題陳述 為了讓學習者更好的了解了解地震…

Coze扣子開發指南:AI零代碼編程創建插件

在Coze扣子中創建插件&#xff0c;有兩種方式&#xff0c;一是用API&#xff0c;具體方式參照上一篇文章《Coze扣子開發指南&#xff1a;用免費API自己創建插件》&#xff0c;還有一種方式就是編程&#xff0c;不過有了AI的幫助&#xff0c;即使不會編程的人&#xff0c;也可以…

HarmonyOS開發案例:【生活健康app之獲取成就】(3)

獲取成就 本節將介紹成就頁面。 功能概述 成就頁面展示用戶可以獲取的所有勛章&#xff0c;當用戶滿足一定的條件時&#xff0c;將點亮本頁面對應的勛章&#xff0c;沒有得到的成就勛章處于熄滅狀態。共有六種勛章&#xff0c;當用戶連續完成任務打卡3天、7天、30天、50天、…

用大于meilisearch-java-0.7.0.jar的報錯的解決

Elasticsearch 做為老牌搜索引擎&#xff0c;功能基本滿足&#xff0c;但復雜&#xff0c;重量級&#xff0c;適合大數據量。 MeiliSearch 設計目標針對數據在 500GB 左右的搜索需求&#xff0c;極快&#xff0c;單文件&#xff0c;超輕量。 所以&#xff0c;對于中小型項目來說…

阿里云服務器在線安裝nginx

??個人主頁: 蒾酒 &#x1f525;系列專欄&#xff1a;《nginx實戰》 目錄 內容簡介 安裝步驟 1.root用戶登錄連接阿里云服務器 2.在usr/local下新建nginx目錄 3.安裝 1安裝下載工具 2下載nginx壓縮包 3解壓 4安裝nginx依賴的庫 5編譯并安裝 6啟動nginx 7開啟…

藍橋杯-遞增三元組(三種解法,二分, 雙指針, 前綴和)

給定三個整數數組 A[A1,A2,…AN], B[B1,B2,…BN], C[C1,C2,…CN], 請你統計有多少個三元組 (i,j,k) 滿足&#xff1a; 1≤i,j,k≤N Ai<Bj<Ck 輸入格式 第一行包含一個整數 N。 第二行包含 N 個整數 A1,A2,…AN。 第三行包含 N 個整數 B1,B2,…BN。 第四行包含 N …

【圖像畸變校正】

接上篇文章&#xff1a;【魚眼&#xff0b;普通相機】相機標定 附代碼&#xff1a; 方法一&#xff1a; 使用cv2.undistort """Create May 11, 2024author Wang Jiajun """import cv2 import numpy as npdef correct(img,camera_fileE:/cali…

怎么使用遠程桌面傳輸文件?

微軟提供的遠程桌面功能是一項強大的工具&#xff0c;可讓您在同一網絡下遠程訪問和管理其他計算機。除了遠程控制&#xff0c;它還支持文件傳輸功能&#xff0c;為Windows用戶提供了極大的便利。在接下來的內容中&#xff0c;我們將介紹如何使用遠程桌面傳輸文件。 如何從遠程…

PADS:生成自交叉平面區域

根據板外形鋪銅方法&#xff1a; pads根據板外形鋪銅_鋪銅如何根據板子形狀改變-CSDN博客 根據板外形創建平面區域出現問題&#xff1a; 解決方法&#xff1a;去找結構&#xff0c;讓他把出圖之前把線合并了

【數據結構】順序棧

順序棧 一、相關概念 棧和隊列是操作受限的線性表&#xff0c;是限定性的數據結構&#xff1b;棧分為順序棧和鏈式棧棧只能在一端進行操作&#xff08;插入、刪除&#xff09;棧是限定僅在表尾進行插入或刪除操作的線性表&#xff0c;因此&#xff0c;對棧來說&#xff0c;表…

https免費證書獲取

獲取免費證書的網址&#xff1a; Certbot 1. 進入你的linux系統&#xff0c;先安裝snapd&#xff0c; yum install snapd 2. 啟動snapd service snapd start 3.安裝 Certbot snap install --classic certbot 注意如下出現此錯誤時&#xff0c;需要先建立snap 軟連接后&am…

山東大學軟件學院創新項目實訓開發日志——第11周

山東大學軟件學院創新項目實訓開發日志——第11周 項目名稱&#xff1a;ModuFusion Visionary&#xff1a;實現跨模態文本與視覺的相關推薦 -------項目目標&#xff1a; 本項目旨在開發一款跨模態交互式應用&#xff0c;用戶可以上傳圖片或視頻&#xff0c;并使用文本、點、…

Golang | Leetcode Golang題解之第84題柱狀圖中最大的矩形

題目&#xff1a; 題解&#xff1a; func largestRectangleArea(heights []int) int {n : len(heights)left, right : make([]int, n), make([]int, n)for i : 0; i < n; i {right[i] n}mono_stack : []int{}for i : 0; i < n; i {for len(mono_stack) > 0 &&am…

SQLite索引名稱重復(index already exists)

文章目錄 概述報錯信息解決方案 概述 SQLite中創建單列索引的方式&#xff0c;跟MySQL類似&#xff1a; CREATE INDEX index_name ON table_name (column_name);但是也有不同的地方&#xff1a; MySQL中索引名稱在表內部不重復即可。 SQLite中索引名稱在整個庫中必須是不重復…

整理項目中經常用到的正則

目錄 1、手機號碼 2、Email 郵箱 3、QQ 號碼 4、非零正整數 5、URL 地址 6、身份證號 項目中難免會經常使用到表單&#xff0c;而表單項校驗就需要用到正則&#xff0c; 所以整理總結一下自己項目中使用比較頻繁的一些正則校驗邏輯。 正則表達式 是由一些具有特殊含義的…