[C++核心編程](七):類和對象——運算符重載*

目錄

四則運算符重載

左移運算符重載

遞增運算符重載

賦值運算符重載

關系運算符重載

函數調用運算符重載


對已有的運算符重新進行定義,賦予其另一種功能,以適應不同的數據類型

四則運算符重載

??????? 對自定義數據類型實現四則運算(加減乘除)操作,比如:自己寫成員函數,實現兩個對象相加屬性后返回新的對象

??????? 注意:四則運算符重載也可以進行函數重載。

??????? 總結:

??????? 1.對于內置的數據類型的表達式的的運算符是不可以改變的

??????? 2.不要濫用運算符重載

#include <iostream>using namespace std;class Person
{
public:int m_a;int m_b;Person(int a, int b) :m_a(a), m_b(b){}//成員函數重載Person operator+(const Person &p){Person rp(0, 0);rp.m_a = this->m_a + p.m_a;rp.m_b = this->m_b + p.m_b;return rp;}
};
//全局函數重載
static Person operator-(const Person& p1, const Person& p2)
{Person rp(0, 0);rp.m_a = p1.m_a - p2.m_a;rp.m_b = p1.m_b - p2.m_b;return rp;
}
//函數重載
static Person operator-(const Person& p1, const int value)
{Person rp(0, 0);rp.m_a = p1.m_a - value;rp.m_b = p1.m_b - value;return rp;
}int main(void)
{Person p1(10, 10);Person p2(10, 10);Person p3(5, 5);Person p4 = p1 + p2; //Person p4 = p1.operator+(p2);cout << "p4 m_a value:" << p4.m_a << endl;cout << "p4 m_b value:" << p4.m_b << endl;Person p5 = p4 - p3; //Person p5 = operator-(p4,p3)cout << "p5 m_a value:" << p5.m_a << endl;cout << "p5 m_b value:" << p5.m_b << endl;Person p6 = p5 - 5; //Person p6 = operator-(p5,5)cout << "p6 m_a value:" << p6.m_a << endl;cout << "p6 m_b value:" << p6.m_b << endl;system("pause");return 0;
}

左移運算符重載

??????? 輸出自定義的數據類型,比如:直接輸出一個對象就可以輸出其成員屬性

??????? 總結:左移運算符配合友元可以實現輸出自定義數據類型

#include <iostream>
#include <string>using namespace std;class Person
{friend static ostream& operator<<(ostream& cout, Person& p);
public:Person(int a, int b){m_a = a;m_b = b;}
private://通常不使用 成員函數重載 左移運算符 ,無法實現cout在左側int m_a;int m_b;
};static ostream& operator<<(ostream &cout, Person& p) // operator<<(cout, p)
{cout << "m_a=" << p.m_a << endl;cout << "m_b=" << p.m_b << endl;return cout;
}static void test(void)
{Person p(10, 10);cout << p << endl;
}int main(void)
{test();system("pause");return 0;
}

遞增運算符重載

??????? 區分前置和后置的差別!!

#include <iostream>
#include <string>using namespace std;class MyInteger
{friend static ostream& operator<<(ostream& cout, MyInteger p);
public:MyInteger(int b){m_b = b;}//重載 后置,int 占位參數 int ,區分前置和后置MyInteger operator++(int){MyInteger temp = *this;++*this;return temp;}//重載 前置MyInteger& operator++() //返回引用是為了一直對一個數據進行操作{++m_b;return *this;}
private:int m_b;
};static ostream& operator<<(ostream& cout, MyInteger p) // operator<<(cout, p)
{cout << p.m_b;return cout;
}static void test(void)
{MyInteger p(0);cout << ++p << endl;cout << p << endl;
}static void test1(void)
{MyInteger p1(0);cout << p1++ << endl;cout << p1 << endl;
}int main(void)
{test();test1();system("pause");return 0;
}

賦值運算符重載

???????? c++至少給一個類添加4個函數:前三個略

????????4.賦值運算符operator=,對屬性進行值拷貝(注意深淺拷貝問題)

#include <iostream>
#include <string>using namespace std;class Person
{
public:Person(int b){m_age = new int(b);}~Person(){if (m_age != NULL){delete m_age;m_age = NULL;}}Person& operator=(const Person & p) //重載賦值運算符,使用深拷貝{if (m_age != NULL){delete m_age;m_age = NULL;}m_age = new int(*p.m_age);return *this;}int *m_age;
};static void test1(void)
{Person p1(12);Person p2(19);Person p3(14);p3 = p2 = p1;cout << "p1年齡為:" << *p1.m_age << endl;cout << "p2年齡為:" << *p2.m_age << endl;cout << "p3年齡為:" << *p3.m_age << endl;
}int main(void)
{test1();system("pause");return 0;
}

關系運算符重載

??????? 重載關系運算符,讓兩個自定義的數據類型進行對比操作

#include <iostream>
#include <string>using namespace std;class Person
{
public:Person(string name, int age){m_name = name;m_Age = age;}bool operator==(Person& p){if (this->m_name == p.m_name && this->m_Age == p.m_Age){return true;}else {return false;}}string m_name;int m_Age;
};static void test1(void)
{Person p1("Tom", 19);Person p2("Mac", 19);if (p1 == p2){cout << "p1 == p2" << endl;}else{cout << "p1 != p2" << endl;}}int main(void)
{test1();system("pause");return 0;
}

函數調用運算符重載

  • 函數調用運算符() 也可以重載
  • 由于重載后使用的方式非常像函數的調用,故稱仿函數
  • 仿函數沒有固定寫法,非常靈活(返回值、參數均不固定)
#include <iostream>
#include <string>using namespace std;class Myprint
{
public:void operator()(string test){cout << test << endl;}
};class MyAdd
{
public:int operator()(int a, int b){return a + b;}
};static void test1(void)
{Myprint myprint;myprint("Hello World!");//仿函數MyAdd myadd;int result = myadd(1, 1);cout << "result = " << result << endl;//匿名函數對象cout << "result = " << MyAdd()(11, 11) << endl;
}int main(void)
{test1();system("pause");return 0;
}

推薦:[C++核心編程](五):類和對象——友元(friend)

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

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

相關文章

新火種AI|AI商業中的里程碑事件已敲定! 歐盟27國一致通過《人工智能法案》。

作者&#xff1a;小巖 編輯&#xff1a;彩云 根據路透社2月2日消息&#xff0c;歐盟國家就《人工智能法案》立法正式達成協議。 此次立法的成功堪稱AI商業領域上的里程碑事件。因為單從商業視角來看&#xff0c;這一法案的通過率先為歐盟內部的人工智能創新提供了明確的法律…

在 Linux 上用 zram 替代傳統交換空間 | Linux 中國

我在我的電腦上花了很多時間&#xff08;我是說工作&#xff09;&#xff0c;我發現了很多有趣的東西。其中最近引起我注意的是 zram0 設備。我是在幾個月前寫一篇文章時第一次注意到它&#xff0c;它顯示在 lsblk 命令的輸出中&#xff1a; # lsblk NAME MAJ:MIN RM…

【VPX637】基于XCKU115 FPGA+ZU15EG MPSOC的6U VPX雙FMC接口通用信號處理平臺

VPX637是一款基于6U VPX總線架構的通用實時信號處理平臺&#xff0c;該平臺采用一片Xilinx的高性能Kintex UltraScale系列FPGA&#xff08;XCKU115-2FLVF1924I&#xff09;作為預處理單元&#xff0c;外掛2個FMC擴展接口&#xff0c;來完成數據采集、數據回放以及實時信號處理算…

[動態規劃,DFS深度搜索]滑雪

滑雪 題目描述 Michael喜歡滑雪&#xff0c;這并不奇怪&#xff0c;因為滑雪的確很刺激。可是為了獲得速度&#xff0c;滑的區域必須向下傾斜&#xff0c;而且當你滑到坡底&#xff0c;你不得不再次走上坡或者等待升降機來載你。Michael想知道在一個區域中的最長底滑坡。區域…

Java---文件,流???

文章目錄 1.遍歷文件夾2.遍歷子文件夾3.練習流4.以字節流的形式讀取文件內容5.以字節流的形式向文件寫入數據頂折糾問6 .寫入數據到文件 1.遍歷文件夾 一般說來操作系統都會安裝在C盤&#xff0c;所以會有一個 C:\WINDOWS目錄。 遍歷這個目錄下所有的文件(不用遍歷子目錄) 找出…

ssh連接ubantu失敗

新系統Ubuntu20.4 安裝ssh server 1. 安裝 openssh-server2. 開啟22號端口 # 安裝ssh服務 sudo apt-get install openssh-server # 安裝防火墻 sudo apt-get install ufw # 開啟防火墻 sudo ufw enable #放開22端口 sudo ufw allow 22 開啟22號端口 倘若ubuntu沒有開啟22…

HTTP/2、HTTP/3分別解決了什么問題

總的來說就是HTTP/1.1是請求-響應模型導致隊頭阻塞問題&#xff0c;HTTP2是TCP層面導致隊頭阻塞問題 HTTP/2 多路復用&#xff0c;解決了HTTP/1.1隊頭阻塞問題 HTTP/1.1 的實現是基于請求-響應模型的。同一個連接中&#xff0c;HTTP 完成一個事務&#xff08;請求與響應&…

3.4作業

課上代碼復習&#xff1a; 廣播接收端代碼: #include<myhead.h> int main(int argc, const char *argv[]) {//創建套接字int rfd socket(AF_INET,SOCK_DGRAM,0);if(rfd -1){perror("socket error");return -1;}printf("rfd %d\n",rfd);//填充地…

臺式電腦電源各線的電壓和電流輸出和輸出電流

臺式電腦電源是電腦硬件的重要組成部分。 它為計算機的各個部件提供所需的電壓和電流。 不同的硬件設備和組件有不同的電壓和電流輸出。 下面詳細介紹臺式電腦電源各線的電壓&#xff0c;包括3.3V、5V、12V、-12V、-5V和5VSB&#xff0c;以及它們的輸出電流和用途。 3.3V&#…

【AI+CAD】(一)ezdxf 解析DXF文件

DXF文件格式理解 DXF文件格式是矢量圖形文件格式&#xff0c;其詳細說明了如何表示不同的圖形元素。 DXF是一個矢量圖形文件&#xff0c;它捕獲CAD圖形的所有元素&#xff0c;例如文本&#xff0c;線條和形狀。更重要的是&#xff0c;DXF是用于在CAD應用程序之間傳輸數據的圖形…

STM32自學?I2C

這里只是大體介紹&#xff0c;具體的可參考STM32數據手冊

數據結構與算法-選擇排序

引言 在計算機科學中&#xff0c;數據結構和算法是兩個至關重要的基石。它們共同決定了程序的效率、可讀性和可維護性。本文我們將聚焦于一種基礎而直觀的排序算法——選擇排序&#xff0c;并探討其內在的工作機制以及在實際應用中的優缺點。 一、什么是選擇排序&#xff1f; …

Leetcode 3067. Count Pairs of Connectable Servers in a Weighted Tree Network

Leetcode 3067. Count Pairs of Connectable Servers in a Weighted Tree Network 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3067. Count Pairs of Connectable Servers in a Weighted Tree Network 1. 解題思路 這一題沒想到什么好的方法&#xff0c;走的是暴力求解的路…

xss.haozi.me:0x07

<img src1 onerroralert(1)

Spring MVC ThemeResolver原理解析

在Spring MVC框架中&#xff0c;ThemeResolver&#xff08;主題解析器&#xff09;是一個重要但經常被忽視的組件。它負責解析和管理Web應用程序中的主題設置&#xff0c;允許用戶根據不同的需求和偏好切換界面主題。ThemeResolver為開發者提供了一種靈活的方式來控制應用程序的…

tomcat下載安裝配置教程

tomcat下載安裝配置教程 我是使用tomcat下載安裝及配置教程_tomcat安裝-CSDN博客 此貼來進行安裝配置&#xff0c;原文21年已經有些許不同。 下載tomcat 官網&#xff1a;http://tomcat.apache.org/ 我們老師讓安裝8.5以上&#xff0c;所以我直接選擇版本9 點擊9頁面之后…

DPDK常用API合集三

librte_timer 此庫為 DPDK 執行單元提供定時器服務&#xff0c;提供異步執行函數的能力。它可以是周期性的函數調用&#xff0c;也可以是一次性調用。它使用環境抽象層&#xff08;EAL&#xff09;提供的定時器接口獲取精確的時間參考&#xff0c;并可以根據需要以每個核心為基…

2024.03.03藍橋云課筆記——排序

sort簡介 #include<algorithm> 使用的是快速排序 時間復雜度為O(nlogn) sort使用(默認是從小到大) 1.sort(起始地址&#xff0c;結束地址的下一位&#xff0c;*比較函數&#xff09;&#xff1b; #include<iostream> #include<algorithm> using namesp…

HTTPS的實現原理

圖片來源&#xff1a;HTTPS 詳解一&#xff1a;附帶最精美詳盡的 HTTPS 原理圖 - 個人文章 - SegmentFault 思否 加密流程按圖中的序號分為&#xff1a; 客戶端請求 HTTPS 網址&#xff0c;然后連接到 server 的 443 端口 (HTTPS 默認端口&#xff0c;類似于 HTTP 的80端口)。…

Windows批處理:bat文件學習

目錄 第一章、快速了解Windows批處理1.1&#xff09;Windows批處理相關概念介紹1.1.1&#xff09;批處理的起源1.1.2&#xff09;bat文件介紹 1.2&#xff09;Demo1.2.1&#xff09;創建文件添加命令1.2.2&#xff09;bat腳本中的命令解釋 第二章、實例2.1&#xff09;點擊bat文…