C++總結筆記(七)—— 運算符重載

文章目錄

  • 一、概念
  • 二、程序示例
    • 1. 加減乘除重載
    • 2. 賦值運算符重載
    • 3. 遞增遞減運算符重載
    • 4. 關系運算符重載
    • 5. 左移運算符重載
    • 6. 函數調用運算符重載


一、概念

C++中運算符重載是為了實現對象之間進行各種運算的特定語法,在某些特定的場合起到重要的作用,新建重載方法需用operator關鍵字進行修飾。

可以重載運算符包括+、-、*、\、賦值運算符=、左移運算符<<、遞增運算符++、遞減運算符- -、關系運算符、函數調用運算符()等。

運算符重載需要遵守以下規則:
1 重載時不能違法運算符原來的句法規則。
2 只能重載C++定義的運算符。
3 不能改變運算符原有的優先級。
4 運算符的結合性不能被改變。
5 不能進行重載的運算符:成員運算符(.),(::),條件運算符,sizeof、強制類型轉換運算符。
6 運算符的目數(又稱“元數”,即運算符所需要的操作數的數目)不能被改變。
7 當重載“()”、“[]、“->”、=時,運算符重載函數必須被聲明為類成員。


二、程序示例

1. 加減乘除重載

#include<iostream>
using namespace std;class MyFloat
{//成員函數重載運算符
public://MyFloat operator+(MyFloat& myf)//{//	MyFloat temp;//	temp.N1 = this->N1 + myf.N1;//	temp.N2 = this->N2 + myf.N2;//	return temp;//}MyFloat operator-(MyFloat& myf){MyFloat temp;temp.N1 = this->N1 - myf.N1;temp.N2 = this->N2 - myf.N2;return temp;}MyFloat operator*(MyFloat& myf){MyFloat temp;temp.N1 = this->N1 * myf.N1;temp.N2 = this->N2 * myf.N2;return temp;}MyFloat operator/(MyFloat& myf){MyFloat temp;temp.N1 = this->N1 / myf.N1;temp.N2 = this->N2 / myf.N2;return temp;}public:float N1;float N2;
};//全局函數重載運算符
MyFloat operator+(MyFloat& Myf1, MyFloat& Myf2)
{MyFloat temp;temp.N1 = Myf1.N1 + Myf2.N1;temp.N2 = Myf1.N2 + Myf2.N2;return temp;
}MyFloat operator+(MyFloat& Myf1, int N)
{MyFloat temp;temp.N1 = Myf1.N1 + N;temp.N2 = Myf1.N2 + N;return temp;
}int main()
{MyFloat myf1;myf1.N1 = float(3.6);myf1.N2 = float(3.4);MyFloat myf2;myf2.N1 = float(3.6);myf2.N2 = float(3.4);/*MyFloat myf3 = myf1.operator+(myf2);*///本質寫法/*MyFloat myf3 = operator+(myf1, myf2);*/MyFloat myf3 = myf1 + myf2;//簡化寫法MyFloat myf31 = myf1 + 1;MyFloat myf4 = myf1 - myf2;MyFloat myf5 = myf1 * myf2;MyFloat myf6 = myf1 / myf2;cout << myf3.N1 << " " << myf3.N2 << endl;cout << myf31.N1 << " " << myf31.N2 << endl;cout << myf4.N1 << " " << myf4.N2 << endl;cout << myf5.N1 << " " << myf5.N2 << endl;cout << myf6.N1 << " " << myf6.N2 << endl;
}
7.2 6.8
4.6 4.4
0 0
12.96 11.56
1 1

2. 賦值運算符重載

#include<iostream>
using namespace std;class MyFloat
{
public:MyFloat(float n){N = new float(n);}//賦值運算符MyFloat& operator=(MyFloat &myf){//先判斷是否有堆區的屬性if (N != NULL){delete N;N = NULL;}//深拷貝N = new float(*myf.N);return *this;}//如果不加賦值運算符重載,對象的賦值操作會引發內存重復釋放的異常。~MyFloat(){if (N != NULL){delete N;N = NULL;}}float *N;
};int main()
{MyFloat myf1(1.1415);MyFloat myf2(2.1415);MyFloat myf3(3.1415);myf3 = myf2 = myf1;cout << *myf3.N << endl;;cout << *myf2.N << endl;;}

3. 遞增遞減運算符重載

#include<iostream>
using namespace std;class MyFloat
{friend ostream& operator<<(ostream& cout, MyFloat myf);
public:MyFloat(){N = 3.1415;}//重載前置++運算符,返回類型為引用,是因為如果不加,返回值屬于值類型,重載函數運行完后會銷毀//運行完后N的值始終只會加一次1,如果再調用重載,N的值不會一直加1MyFloat& operator++(){//先進行++計算N++;return *this;}//重載后置++運算符,int代表占位參數,用于區分前置后置MyFloat& operator++(int){//先記錄當時的結果MyFloat temp = *this;//后遞增N++;return temp;}//重載前置--運算符MyFloat& operator--(){//先進行--計算N--;return *this;}//重載后置--運算符,int代表占位參數,用于區分前置后置MyFloat& operator--(int){//先記錄當時的結果MyFloat temp = *this;//后遞減N--;return temp;}private:float N;
};ostream& operator<<(ostream & cout, MyFloat myf)
{cout << myf.N;return cout;
}int main()
{//后置重載MyFloat myf;cout << myf++ << " " << endl;cout << myf << endl;cout << myf-- << " " << endl;cout << myf << endl;MyFloat myf1;cout << ++myf1 << " " << endl;cout << ++(++myf1) << " " << endl;//又調用一次++相當于先調用了一次拷貝構造函數,然后再調用重載,拷貝構造函數會重新創建一個拷貝的值的內存,再運行完后銷毀。//如果重載返回值類型不加&,會直接銷毀++myf1的拷貝值,加&,會創建一個指針常量,一直指向內存中的N,返回值也會一直是類中的N,而不是拷貝的N的值。cout << myf1 << endl;cout << --myf1 << " " << endl;cout << myf1 << endl;
}
3.1415
4.1415
4.1415
3.1415
4.1415
4.1415
3.1415
3.1415

4. 關系運算符重載

#include<iostream>
using namespace std;class MyFloat
{
public:MyFloat(float n){N = n;}//等于運算符bool operator==(MyFloat& myf){if (this->N == myf.N){return true;}else{return false;}	}//大于運算符bool operator>(MyFloat& myf){if (this->N > myf.N){return true;}else{return false;}}float N;
};int main()
{MyFloat myf1(1.1415);MyFloat myf2(1.1415);MyFloat myf3(3.1415);if (myf1 == myf2){cout << "myf1與myf2相等" << endl;}if (myf3 > myf2){cout << "myf3大于myf2" << endl;}
}
myf1與myf2相等
myf3大于myf2

5. 左移運算符重載

#include<iostream>
using namespace std;class MyFloat
{friend ostream& operator<<(ostream& cout, MyFloat myf);
public:MyFloat(){N = 3.1415*N1;}private:float N;float N1 = float(2);
};//重載左移運算符,只能利用全局函數重載。成員函數重載時會發生cout在右側。
//ostream類只能用引用的方式聲明對象。
ostream& operator<<(ostream & cout, MyFloat myf)
{cout << myf.N;return cout;
}int main()
{MyFloat myf;cout << myf << endl;}
6.283

6. 函數調用運算符重載

#include<iostream>
using namespace std;class MyFloat
{
public:MyFloat(float n){N = n;}//函數調用運算符float operator()(float n1,float n2){return n1 + n2;}float N;
};int main()
{MyFloat myf(0);float c = myf(float(1.1415), float(1.1415));//與函數調用相似,又稱為仿函數cout << c << endl;cout << MyFloat(0)(float(1.1415), float(1.1415)) << endl;//匿名對象}

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

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

相關文章

asp.net 加載xml到menu

XML File <?xml version"1.0" encoding"utf-8" ?> <Area iAreaID "0" cAreaName"城市"><Province iAreaID "1" cAreaName"北京市"/><Province iAreaID "2" cAreaName"上海…

前端lvs訪問多臺nginx代理服務時出現404錯誤的處理

前端lvs訪問多臺nginx代理服務時出現404錯誤的處理 環境描述&#xff1a;app --> lvs --> nginx --> server app訪問頁面購買流量頁面(nginx服務器)代理到后端和服務器交互(多臺server)剛開始訪問沒有問題&#xff0c;流量變大為了避免出現問題&#xff0c;nginx配置了…

使用numpy出現DeprecationWarning: The normed argument is ignored when density is provided. 解決方法忽略警告的方法

目錄 1、從根本上進行解決 2、直接利用warning模塊忽略警告 1、從根本上進行解決 “DeprecationWarning: The normed argument is ignored when density is provided. In future passing both will result in an error.” 這種一般是因為函數庫或者是一些包package版本更新而…

iptables四個表與五個鏈間的處理關系

轉載自&#xff1a;http://www.linuxidc.com/Linux/2012-08/67505.htm netfilter/iptables IP 信息包過濾系統是一種功能強大的工具&#xff0c;可用于添加、編輯和除去規則&#xff0c;這些規則是在做信息包過濾決定時&#xff0c;防火墻所遵循和組成的規則。 這些規則存儲在專…

C++總結筆記(八)—— 菱形繼承

文章目錄一、基本概念二、程序舉例1. 虛繼承2. 內在邏輯一、基本概念 菱形繼承是指存在兩個子類繼承自同一個基類&#xff0c;同時有子類繼承這兩個子類。 二、程序舉例 1. 虛繼承 使用虛繼承可以解決菱形繼承資源浪費的問題&#xff0c;因為有兩個子類繼承基類&#xff0c…

Linux命令:mkdir

全稱&#xff1a;make directories 用途&#xff1a;創建新目錄 格式&#xff1a;mkdir [OPTION]... DIRECTORY... 類型&#xff1a;mkdir is hashed (/bin/mkdir) 說明&#xff1a; 創建文件目錄&#xff0c;較常用的選項參數有兩個&#xff1a; -m, --modeMODE&#xff1a;直…

InnoDB引擎與MyIASM的一點總結

InnoDB引擎&#xff1a; 提供了對數據庫ACID事務的支持&#xff0c;并且實現了SQL標準的四種隔離級別 提供了行級鎖和外鍵約束。 它的設計的目標是處理大容量數據庫系統&#xff0c;用于緩沖數據和索引。 不支持FULLTEXT類型的數據&#xff0c;沒有保存表的行數&#xff0c;當s…

C++總結筆記(九)—— 多態

文章目錄一、多態是什么&#xff1f;二、使用步驟2.1. 靜態多態2.1.1 函數重載2.1.2 模板2.2.動態多態2.2.1 示例2.2.2 原理分析總結一、多態是什么&#xff1f; 多態是面向對象的語言中都必須掌握的特性&#xff0c;其概念簡單講就是對同一種特性的方法有不同的實現功能&…

[轉]c++類的構造函數詳解

c構造函數的知識在各種c教材上已有介紹&#xff0c;不過初學者往往不太注意觀察和總結其中各種構造函數的特點和用法&#xff0c;故在此我根據自己的c編程經驗總結了一下c中各種構造函數的特點&#xff0c;并附上例子&#xff0c;希望對初學者有所幫助。 c類的構造函數詳解 …

結構體對齊問題

#pragma (1)typedef struct {};#pragma ()#pragma pack(1) 的意義是什么skypxl | 瀏覽 27771 次發布于2009-10-01 16:38最佳答案設置結構體的邊界對齊為1個字節&#xff0c;也就是所有數據在內存中是連續存儲的。比如你在C語言中定義下面這樣的結構體&#xff1a;struct s {cha…

【機器學習】——純Python建立BP模型

參考:https://blog.csdn.net/michael_f2008/article/details/103715699 https://developer.aliyun.com/article/614411 import pandas as pd import numpy as np import datetime from sklearn.utils import shuffle# 1.初始化參數 def initialize_parameters(n_x, n_h, n_y…

組件局域網中的無集線器、Windows XP、Windows 7、Windows 8的對等網

為什么要用對等網&#xff1f; 答&#xff1a;對等網采用分散管理的方式&#xff0c;網絡中的每臺計算機既作為客戶機又可作為服務器來工作&#xff0c;每個用戶都管理自己機器上的資源。 組建局域網中無集線器的對等網 組建局域網中Windows XP的對等網 組建局域網中Windows 7的…

datatable綁定comboBox顯示數據[C#]

實現功能&#xff1a;datatable綁定comboBox,在下拉菜單中顯示對應數據 實現方法&#xff1a;    //dataSet 轉 dataTable    1、生成datatable&#xff0c;并為combox綁定數據源&#xff1a;comboBox1.DataSource dt1;comboBox1.DisplayMember "用戶編碼"…

C++總結筆記(十)——堆區內存開辟數組和二級指針

文章目錄一、堆區開辟數組1. 數組指針與指針數組的區別2. 1維數組3. 2維數組二、二級指針一、堆區開辟數組 1. 數組指針與指針數組的區別 數組指針是指指向數組的指針&#xff0c;它的本體是一個指針, 聲明指針變量的時候一般用括號&#xff0c;因為括號的優先級高于[]&#…

阿里巴巴將赴NIPS 2017 3大事業部聯袂展示AI全技能

被譽為國際頂級的機器學習和神經網絡學術會議NIPS 2017將于12月4日-9日在美國加州長灘市舉行。在本屆會議上&#xff0c;阿里巴巴除有兩篇論文入選Workshop并進行Oral和Poster形式報告外&#xff0c;3大技術事業部將連續3天&#xff08;5日-7日&#xff09;在阿里展區舉行多場技…

【圖像處理】——Python實現圖像特征提取BP神經網絡實現圖像二分類

目錄 一、圖像特征提取 二、BP實現圖像二分類 1、輸入層、隱層、輸出層結點個數設置

mysql sql語句大全

1、新建用戶&#xff1a;>CREATE USER name IDENTIFIED BY ssapdrow; 2、更改密碼&#xff1a; >SET PASSWORD FOR namePASSWORD(fdddfd); 3、權限管理 >SHOW GRANTS FOR name; //查看name用戶權限 >GRANT SELECT ON db_name.* TO name;    //給name用戶db_…

C++總結筆記(十一)—— Lambda表達式的應用

文章目錄一、Lambda表達式是什么&#xff1f;二、程序示例1. 在STL中的使用一、Lambda表達式是什么&#xff1f; Lambda表達式時C11引入的語法&#xff0c;本質上是一個匿名函數&#xff0c;用[ ] () {}三個符號組成表達式。 格式為&#xff1a;[capture list] (params list) …

【文件處理】——字典寫入json文件或TXT文件,讀取文件中的字典TypeError: Object of type ‘ndarray‘ is not JSON serializable錯誤解決方法

目錄 一、將字典寫入json文件 二、json文件中讀取字典 三、將字典寫入TXT文件中 四、從TXT中讀取字典 五、解決字典含數組存入json文件失敗的方法 1、存入前將數組變成列表 2、擴展類方法 一、將字典寫入json文件 import jsontest_dict {version: "1.0",exp…

js一些實用例子

1.獲取焦點選中文本內容 $("#id").focus(function(){ this.select(); }); 2.表單提交方式 A.自動提交 setTimeout(function(){表單對象.submit();},2000); B.onclick事件提交(鏈接提交) <input type"submit" value"提交" οnclick"retur…