Part8 多態性 8.1運算符重載

1運算符重載的規則
C++ 幾乎可以重載全部的運算符,而且只能夠重載C++中已經有的。
不能重載的運算符:“.”、“.*”、“::”、“?:”
重載之后運算符的優先級和結合性都不會改變。

重載的兩種形式:
  1 重載為類的非靜態成員函數;
  2 重載為非成員函數。

?

?


2雙目運算符重載為成員函數

函數類型 operator 運算符(形參)
{
......
}
參數個數=原操作數個數-1 (后置++、--除外)

雙目運算符重載規則:
  如果要重載 B 為類成員函數,使之能夠實現表達式 oprd1 B oprd2,其中 oprd1 為A 類對象,則 B 應被重載為 A 類的成員函數,
  形參類型應該是 oprd2 所屬的類型。
  經重載后,表達式 oprd1 B oprd2 相當于 oprd1.operator B(oprd2)

//例8-1復數類加減法運算重載為成員函數
#include<iostream>
using namespace std;
class Complex{
public:Complex(double r = 0.0, double i = 0.0):real(r), image(i){}Complex operator +(const Complex &c2) const;Complex operator -(const Complex &c2) const;void display() const;
private:double real;double image;
};
Complex Complex::operator+(const Complex &c2) const{return Complex(real+c2.real, image+c2.image);//創建一個臨時無名對象作為返回值
}
Complex Complex::operator-(const Complex &c2) const{return Complex(real-c2.real, image-c2.image);
}
void Complex::display() const{cout << "(" << real << ", " << image << ")" << endl;
}
int main(){Complex c1(5,4),c2(2,10),c3;cout << "c1 = "; c1.display();cout << "c2 = "; c2.display();c3 = c1 - c2;cout << "c3 = c1 - c2 = "; c3.display();c3 = c1 + c2;cout << "c3 = c1 + c2 = "; c3.display();return 0;
}

?

?


3單目運算符重載為成員函數
前置單目運算符重載規則:
  如果要重載 U 為類成員函數,使之能夠實現表達式 U oprd,其中 oprd 為A類對象,則 U 應被重載為 A 類的成員函數,無形參。
  經重載后,表達式 U oprd 相當于 oprd.operator U()
后置單目運算符 ++和--重載規則:
  如果要重載 ++或--為類成員函數,使之能夠實現表達式 oprd++ 或 oprd-- ,其中 oprd 為A類對象,則 ++或-- 應被重載為 A 類的成員函數,且具有一個 int 類型形參。
  經重載后,表達式 oprd++ 相當于 oprd.operator ++(0)

?

//例8-2重載前置++和后置++為時鐘類成員函數
#include<iostream>
using namespace std;
class Clock{
public:Clock(int hour = 0, int minute = 0, int second = 0);void showTime() const;Clock& operator ++();//前置單目運算符重載Clock operator ++ (int);//用參數表來區分兩個重載函數,函數體中不適用
private:int hour, minute, second;
};
Clock::Clock(int hour, int minute, int second){if(0 <= hour && hour < 24 && 0 <= minute && minute < 60 && 0 <= second && second <60){this->hour = hour;this->minute = minute;this->second = second;}else{cout << "Time error!" << endl;}
}
void Clock::showTime() const{cout << hour << " : " << minute << " : " << second << endl;
}
Clock &Clock::operator ++ (){//返回本類對象的引用second++;if(second >= 60){second-=60;minute++;if(minute >= 60){minute-=60;hour = (hour+1)%24;}}return *this;
}
Clock Clock::operator ++(int){Clock old = *this;++(*this);//調用前置++運算符(形參)return old;
}
int main(){Clock myClock(23,59,59);cout << "First time output: ";myClock.showTime();cout << "Show myClock++: ";(myClock++).showTime();cout << "Show ++myClock: ";(++myClock).showTime();return 0;
}

?

?

?


4運算符重載為非成員函數
運算符重載為非成員函數的規則:
  函數的形參代表依自左至右次序排列的各操作數。
  參數個數=原操作數個數(后置++、--除外)
  至少應該有一個自定義類型的參數。
  如果在運算符的重載函數中需要操作某類對象的私有成員,可以將此函數聲明為該類的友元。

雙目運算符 B重載后,
  表達式oprd1 B oprd2
  等同于operator B(oprd1,oprd2)
前置單目運算符 B重載后,
  表達式 B oprd
  等同于operator B(oprd )
后置單目運算符 ++和--重載后,
  表達式 oprd B
  等同于operator B(oprd,0)

?

//例8-3 重載Complex的加減法和“<<”運算符為非成員函數
#include<iostream>
using namespace std;
class Complex{
public:Complex(double r = 0.0, double i = 0.0):real(r), image(i){}friend Complex operator+(const Complex &c1, const Complex &c2);friend Complex operator-(const Complex &c1, const Complex &c2);//它的左操作數是std::ostream引用,右操作數為復數類的常引用,返回std::ostream引用friend ostream &operator<<(ostream &out, const Complex &c);
private:double real;double image;
};Complex operator+(const Complex &c1, const Complex &c2){return Complex(c1.real+c2.real, c1.image+c2.image);
}
Complex operator-(const Complex &c1, const Complex &c2){return Complex(c1.real-c2.real, c1.image-c2.image);
}
ostream &operator<<(ostream &out, const Complex &c){out << "(" << c.real << ", " << c.image << ")";return out;
}
int main(){Complex c1(5,4),c2(2,10),c3;cout << "c1 = " << c1 << endl;cout << "c2 = " << c2 << endl;c3 = c1 - c2;cout << "c3 = c1 - c2 = " << c3 << endl;c3 = c1 + c2;cout << "c3 = c1 + c2 = " << c3 << endl;return 0;
}

?

轉載于:https://www.cnblogs.com/leosirius/p/8075666.html

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

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

相關文章

H面試程序(29):求最大遞增數

要求&#xff1a;求最大遞增數 如&#xff1a;1231123451 輸出12345 #include<stdio.h> #include<assert.h> void find(char *s) {int maxleng 0;int length 1;int pos 0;int i 0;while(s[i] !\0){ if((s[i])<0||(s[i]>9)){assert(0);}if((s[i1]-0) &g…

reorder-list

/*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*///思路:通過不同的首結點獲取到不同的尾結點,然后拼接public class Solution {public ListNode get…

四大主流芯片架構(X86、ARM、RISC-V和MIPS)

目前市場上主流的芯片架構有 X86、ARM、RISC-V和MIPS四種&#xff1a; 序號架構特點代表性的廠商運營機構發明時間1X86性能高&#xff0c;速度快&#xff0c;兼容性好英特爾&#xff0c;AMD英特爾1978年2ARM成本低&#xff0c;低功耗蘋果&#xff0c;谷歌&#xff0c;IBM&…

微博預計要火一陣的SleepSort之Shell及C實現

今日在微博看到如此奇妙的代碼。竟然還有新的sort算法&#xff0c;對于我這樣的渣渣必須研究一下&#xff0c;代碼例如以下&#xff1a; #!/bin.bash function f() {sleep "$1" //sleep 這么多secho "$1" }while [ -n "$1" ] //第一個參數不為空…

相關類以及常用方法

1、system&#xff1a;(系統相關類&#xff09; 常用方法&#xff1a; a) : system.arraycopy(制定數組&#xff0c;開始復制的位置&#xff0c;目標數組&#xff0c;開始粘貼的位置&#xff0c;需要復制的長度) 。 將指定源數組中的數組從指定位置復制到目標數組的指定位…

2021-11-15

本文將重點圍繞國產CPU的發展歷程與當前產業鏈各領軍企業的布局情況作詳盡解讀&#xff08;并包含特大號獨家整理的最新進展&#xff09;&#xff0c;具體如下&#xff1a; 1、國產CPU發展歷程回溯 2、飛騰&#xff1a;PK生態的主導者 3、鯤鵬&#xff1a;快速崛起的領導者 …

關于在ubuntu下配置AMD顯卡驅動的總結

同樣先卸載先前版本 代碼:sudo sh /usr/share/ati/fglrx-uninstall.sh代碼:sudo apt-get remove --purge fglrx fglrx_* fglrx-amdcccle* fglrx-dev*重啟 代碼:sudo reboot下載驅動&#xff0c;右邊直接有ubuntu32位和64位驅動鏈接&#xff1a;http://support.amd.com/en-us/do…

Python3中的hasattr()

Python3已經將此內置函數移除了。查閱Python v3.0 documentation發現可以使用 hasattr(object, name)內置函數來完成callable的功能&#xff0c;方式如下&#xff1a; 3.0之前&#xff1a;callable(func) 3.0之后&#xff1a;hasattr(func, __call__) 這兩者結果是相同的。 轉載…

計算機結構簡圖

北橋,南橋是主板上芯片組中最重要的兩塊了.它們都是總線控制器.他們是總線控制芯片.相對的來講,北橋要比南橋更加重要.北橋連接系統總線,擔負著cpu訪問內存的重任.同時連接這AGP插口,控制PCI總線,割斷了系統總線和局部總線,在這一段上速度是最快的.南橋不和CPU連接通常用來作I/…

原始Ajax

var $ { request:function(obj){ //1. 獲得xmlhttprequest對象兼容性處理 var xhr; //undefined未定義 try{ //主流瀏覽器里面的ajax對象 xhr new XMLHttpRequest(); }catch(e){ //IE低版本的瀏覽器 xhr new ActiveXObject("Microsoft.XMLHTTP"); } //2. 建立和…

Servlet 與 Ajax 交互一直報status=parsererror

Servlet 與 Ajax 交互一直報statusparsererror 原因&#xff1a;servlet 返回的數據不是 Json 格式 1、JS代碼為&#xff1a; 1 var jsonStr {clusterNum:2,iterationNum:3,runTimes:4};2 $.ajax({3 type: "post",4 //http://172.2…

25LINQ拾遺及實例

投影 □ 遍歷數組索引&#xff0c;Select獲取 int[] indexes {0, 2}; string[] strs {"a", "b", "c", "d"}; var result from i in indexes select strs[i]; foreach (string str in result) { Console.Write(str " &quo…

國產CPU的6大品牌,3大路線對比

這些年來&#xff0c;中國最想發展的科技產品是什么&#xff1f;那必須是芯片&#xff0c;特別是2018年中興事件、2019年華為事件之后&#xff0c;國內的芯片產業就徹底地火爆了起來。 按照數據顯示&#xff0c;截止至2020年10月份&#xff0c;國內已經有27萬家芯片企業&#…

BluePrint和ORM

一、藍圖創建 1 #引入庫文件2 from flask import Blueprint,request,jsonify3 4 user Blueprint(5 "site",6 __name__,7 template_floder"templates_folder_path",8 static_floder"static" 9 ) #創建藍圖 10 1…

【js實例】Array類型的9個數組方法,Date類型的41個日期方法,Function類型

前文提要:【js實例】js中的5種基本數據類型和9種操作符 Array類型的9個數組方法 Array中有9個數組方法: 1.檢測數組 2.轉換方法 3.棧方法 4.隊列方法 5.沖排序方法6.操作方法 7.位置方法 8.迭代方法 9.歸并方法 在實例中介紹,實例如下 /* Array類型 js數組中的每一項可以用來保…

調用詠南中間件插件演示

function GetSvrData(const accountNo, defineId: WideString; inParams: OleVariant): OleVariant; virtual; abstract; // accountNo&#xff0c;帳套編號 // defineId3位插件編號2位自定義編號&#xff0c;defineId必須是唯一的 // inParams&#xff0c;TDataSet.Params的OL…

龍芯與飛騰roadmap

飛騰roadmap 龍芯roadmap 龍芯系列處理器芯片是龍芯中科技術有限公司研發的具有自主知識產權的處理器芯片&#xff0c;產品以32位和64位單核及多核CPU/SOC為主&#xff0c;主要面向國家安全、高端嵌入式、個人電腦、服務器和高性能機等應用。產品線包括龍芯1號小CPU、龍芯2號中…

vim 多窗口操作

1、打開多個窗口打開多個窗口的命令以下幾個&#xff1a;橫向切割窗口:new窗口名(保存后就是文件名) :split窗口名&#xff0c;也可以簡寫為:sp窗口名縱向切割窗口名:vsplit窗口名&#xff0c;也可以簡寫為&#xff1a;vsp窗口名2、關閉多窗口可以用&#xff1a;q!&#xff0c;…

BZOJ 2440 完全平方數(莫比烏斯-容斥原理)

題目鏈接&#xff1a;http://61.187.179.132/JudgeOnline/problem.php?id2440 題意&#xff1a;給定K。求不是完全平方數&#xff08;這里1不算完全平方數&#xff09;的倍數的數字組成的數字集合S中第K小的數字是多少&#xff1f; 思路&#xff1a;首先&#xff0c;答案不超過…

在Eclipse中添加JDK源碼包

一直有這想要在Eclipse直接閱讀JDK的需求&#xff0c;之前用的都是反編譯的&#xff0c;由于我用的反編譯的插件去掉了源碼內容的注釋&#xff0c;所以想直接導入JDK源碼包&#xff1a; 詳細步驟&#xff1a; 打開Eclipse, 菜單欄 選擇 Window 下拉種選取 Preferences 窗口. 以…