運算子多載 Operator Overloading

Similar documents
PowerPoint Presentation

運算子多載 Operator Overloading

運算子多載 Operator Overloading

Microsoft Word - caa2.doc

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

第八﹑九章 I/O系統

第3章.doc

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

c_cpp

前言

<4D F736F F D20CAD9C3FCCAC7D7D4BCBAD2BBB5E3D2BBB5CEC5ACC1A6C0B4B5C4A1AAA1AA41342E646F63>

第十章 虛擬函數 (Virtual Functions)

新版 明解C++入門編

Chapter12 Derived Classes

C/C++语言 - C/C++数据

FY.DOC

Microsoft PowerPoint - string_kruse [兼容模式]

Microsoft PowerPoint - 11_Templates.ppt

踏出C++的第一步

第二章 簡介類別

Strings

Template

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

Scott Effective C++ C++ C++ Roger Orr OR/2 ISO C++ Effective Modern C++ C++ C++ Scoot 42 Bart Vandewoestyne C++ C++ Scott Effective Modern C++ Damien

untitled

issue27.indd

汉 籍 中 瓯 脱 一 词 应 为 匈 奴 语 的 汉 语 译 音 那 么 其 语 意 究 竟 何 指 对 此 古 今 史 家 展 开 了 广 泛 讨 论 概 括 起 来 不 外 有 四 种 说 法 第 一 瓯 脱 为 边 界 上 的 防 卫 设 施 索 隐 引 汉 人 服 虔 曰 作 土 室 以

中 国 经 济 史 研 究 年 第 期 也 有 成 为 个 体 商 贩 者 例 如 永 茂 和 商 号 的 创 始 人 李 永 茂 开 店 以 前 曾 在 缅 甸 八 募 与 腾 冲 之 间 以 肩 挑 马 驮 贩 运 商 品 为 生 稍 有 积 累 便 在 缅 甸 抹 谷 开 设 店 铺 成 为

历 史 人 物 研 究 中 的 翻 案 问 题 界 强 烈 反 响 这 篇 文 章 是 蔡 剧 塑 造 的 曹 操 形 象 的 基 础 他 称 曹 操 是 了 不 起 的 历 史 人 物 曹 操 对 于 民 族 的 发 展 和 文 化 的 发 展 有 大 的 贡 献 在 同 时 代 人 中 贡 献

投 资 与 中 国 的 对 外 开 放 联 系 起 来 并 敏 锐 地 点 明 了 中 国 现 行 的 公 有 制 与 华 侨 投 资 的 私 有 制 关 系 的 实 质 性 问 题 这 是 他 率 先 为 中 国 对 外 开 放 打 开 的 一 个 突 破 口 为 以 后 大 规 模 利 用 外

生死之交

Microsoft Word - ch04三校.doc

Java 程式設計入門

Microsoft Word cppFinalSolution.doc

C++ 程式設計

Strings

kuojidatabase

NethersoleJO89(8).indd

Microsoft Word - 物件導向編程精要.doc

( ) 001 ( 131 ) : 1- ISBN X/I 1091 :

Microsoft Word - ACL chapter02-5ed.docx

untitled

C 1

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

CC213

Microsoft PowerPoint - 07-overloaded.ppt

ebook39-5

第七讲 继承与多态

<4D F736F F F696E74202D20A9F6B867A452A8F6BB50A565C25F2DBE47BC79AA5A2DBCC6A6ECB1D0A7F72E BACDBAE65BCD2A6A15D>

C++ 程序设计 实验 2 - 参考答案 MASTER 2017 年 5 月 21 日 1


利 润 预 计 为 360, 万 元 ; 假 设 2016 年 归 属 母 公 司 所 有 者 的 净 利 润 较 2015 年 度 预 测 值 的 基 础 上 增 长 15%, 为 414, 万 元 上 述 利 润 值 不 代 表 公 司 对 未 来 利 润 的 盈 利 预

黄 永 润 带 队 参 加 市 场 营 销 与 物 流 管 理 培 训 班... 6 黄 永 润 出 席 茶 业 集 团 春 茶 生 产 经 营 分 析 会... 6 大 明 山 茶 文 化 生 态 家 园 项 目 签 约 仪 式 在 邕 举 行... 7 广 西 职 业 技 术 学 院 开 展 庆

中山市**局2005年部门预算基本情况说明


<4D F736F F D203234A8E2A9A4B142ABC3AABAB7C5B1A1ADB1BB50AA6BA8EEADB1>

机动车驾驶证申领和使用规定(公安部令第91号)

<4D F736F F D20A2B0A1D0A2B0A1D0A2B0A240A6CBAA4FC554BC4DB7ABA240A7D6AA4FBD6DB2DF2E646F63>

Microsoft Word 薪酬管理制度.doc

0660

<4D F736F F D203033C8ABC8D5D6C6B1BEA1A2D7A8BFC6C9FAD1A7B7D6D6C6D1A7BCAEB9DCC0EDB9E6B6A82E646F63>

黄 河 两 岸 耸 立 着 万 丈 高 山 战 士 们 站 在 河 畔 仰 起 头 看, 天 像 一 条 摆 动 的 长 带 子 人 要 站 在 河 两 岸 的 山 尖 上, 说 不 定 云 彩 就 从 耳 边 飞 过, 伸 手 也 能 摸 着 冰 凉 的 青 天 山 峡 中, 浑 黄 的 河 水

Microsoft Word - 雲林縣學校轉型優質計畫.docx

<4D F736F F D20BDADCBD5CAA1B9A9CFFABACFD7F7D7DCC9E7BCF2B1A8B5DA3239C6DA2E646F63>

<4D F736F F D20C3F1D3C3BBFAB3A1BDA8C9E8B9DCC0EDB9E6B6A8B7A2B2BCB8E52E646F63>

慈宗彌勒淨土法門的殊勝

5.1施工企业会计核算办法

論文全.doc

专科疾病诊治(十二)


untitled



Az b.doc

文档2

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

PowerPoint Presentation

ebook39-6

untitled

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1

Microsoft PowerPoint - Class5.pptx

untitled

Ps22Pdf

Microsoft PowerPoint - Class4.pptx

untitled

Microsoft PowerPoint - Class2.pptx

1.5招募说明书(草案)

山东建筑大学学分制管理规定(试行)

第 一 节 认 识 自 我 的 意 义 一 个 人 只 有 认 识 自 我, 才 能 够 正 确 地 认 识 到 自 己 的 优 劣 势, 找 出 自 己 的 职 业 亮 点, 为 自 己 的 顺 利 求 职 推 波 助 澜 ; 一 个 人 只 有 认 识 自 我, 才 能 在 求 职 中 保 持

1

Microsoft Word - well_game.doc

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

Microsoft PowerPoint - 10 模板 Template.pptx

<4D F736F F D B0A2CDC1B8E7B9DBCAD0D6AED6C6B6C8CFC2B5C4B5B020CFB5C1D0D6AEB6FE205354B9C9B5C4F7C8C1A6>

untitled

A.doc

今天 年春季号 总 92 期

*

( ) / / / / / / /

Transcription:

多載 Overloading 講師 : 洪安 1

多型 編譯時期多型 ( 靜態多型 ) function overloading 函數多載 如何正確呼叫同名的函數? 利用參數個數與型態 operator overloading 運算子多載 其實同 function overloading 執行時期多型 ( 或動態多型 ) 如何正確呼叫不同物件的相同名稱的成員函數 利用繼承與多型 2

函數多載 Function Overloading 同樣名稱的函數有多種格式, 或說多個函數共用一個函數名稱 可以定義兩個有相同名稱的函數, 但函數簽名 (Signature) 必須不同 引數串列的引數數目 引數型態 預設引數是可以使用不同數目的引數呼叫同一個函數 Animal::Animal(int a, const char * cat = Elephant ){ age = a; strcpy(category,cat); 一個函數定義 兩種不同引數呼叫 Animal ob1(16); 3 Animal ob2(18, Dog );

範例練習 定義一組 print() 函數, 其原型如下 : 當使用 print() 函數時, 編譯程式從函數原型找一個符合函數呼叫的相同簽名 試試 3_Print.cpp, 看看每個呼叫各是執行了哪一個函數! 4

運算子多載的基礎 什麼是運算子多載? 讓運算子 ( 符號 ) 有不同的意義 例 : 運算子的預設意義 ( 以 + 與 = 為例 ) class frac { ; int main() { int x=5, y =3, z ; z = x + y ; // 使用 = + int a[10], b[10], c[10]; c = a + b ; // 可乎??? frac f1(3,5), f2(2, 5), f3 ; f3 = f1 + f2 ; // 3/5 + 2/5 = 1, 可乎? return 0; 可以重新定義 + = 運算子應用在 frac 物件上的意義嗎? 5

如果沒有運算子多載能力 int main() { frac f1(3,5), f2(2, 5), f3 ; f3.set(f1.add(f2)) ; // 模擬 f3 = f1 + f2 ; if (f1.great_equal(f2)) cout << f1 >= f2 ; // f1 >= f2 cout<< f3= ; f3.print() ; // cout << f3= <<f3 ; return 0; 可行嗎? 缺點? f3=f1+f2; if (f1>=f2) { cout << f3; 6

運算子的種類 依運算元分 二元運算子 +, -, *, /, =, >, <, 一元運算子 a++, --b, -c, +d 其他運算子 依功能分 算術運算子 +, -, *, /, =, +=, - =, 比較運算子 >, <, >=, <=, 位元運算子 <<, >>, ~,, ^, 其他運算子 7

算術運算子 8

比較運算子 9

其他運算子 10

多載二元運算子 範例一 class Coord { int x, y ; ; int main() { Coord o1(10,10), o2(5,3), o3 ; o3 = o1 + o2; // o3 (15, 13) o3.print() ; //later, you can use cout << o3 ; return 0; 11

多載運算子 + = (1/4) class Coord { int x, y ; ; int main() { Coord o1(10,10), o2(5,3), o3 ; o3.set(o1.add(o2)); // o3 = o1 + o2 ; o3.print() ; //later, you can use cout << o3 ; return 0; 12

多載運算子 + = (2/4) class Coord { int x, int y; public: Coord(){ Coord(int a, int b){x=a; y=b; Coord add(coord c) { Coord temp ; temp.x = x + c.x ; temp.y = y + c.y ; return temp ; void set(coord c) { x = c.x; y=c.y; ; void print(){cout<<x<<y<<endl; o3.set(o1.add(o2)) ; temp <= o1.add(o2) ; o3 <= temp ; 13

課堂練習 尚未多載 :3_NotYet.cpp #include <iostream> using namespace std; class Coord { int x,y; public: Coord(); Coord(int, int); void print(); ; Coord::Coord(int a,int b) { x=a; y=b; 14

void main() { 多載運算子 + = (3/4) class Coord { Coord operator+(coord c) { // 原 add() Coord temp ; temp.x = x + c.x ; temp.y = y + c.y ; return temp ; void operator=(coord c) { // 原 set() x = c.x; y=c.y; ; Coord o1(10,10), o2(5,3), o3 ; // 原 o3.set(o1.add(o2)); o3.operator=(o1.operator+(o2)); 15

void main() { 多載運算子 + = (4/4) class Coord { o3 = o1 + o2 ; Coord operator+(coord c) { // 原 add() coord temp ; temp.x = x + c.x ; temp.y = y + c.y ; return temp ; void operator=(coord c) { // 原 set() x = c.x; y=c.y; ; Coord o1(10,10), o2(5,3), o3 ; // 原 o3.set(o1.add(o2)); // o3.operator=(o1.operator+(o2); 16

牢記運算式的真面目 o3 = o1 + o2 ; o3 = o1.operator+(o2) ; o3.operator=(o1.operator+(o2)) ; 17

如何多載運算子 在類別中建立運算子函數 (operator function) 語法 class 類別名稱 { // overload 運算子 X 回傳型態 operatorx( 參數列表 ) { ; 18

將多載運算子定義在 class 外 class Coord { Coord operator+(coord c) ; void operator=(coord c) ; ; Coord Coord::operator+(Coord c) {. void Coord::operator=(Coord c) { 19

課堂練習 運算子多載 (3_OpOverload.cpp) int main() { Coord o1(10,10), o2(5,3), o3 ; o3=o1+o2; // o3 = o1 + o2 ; o3.print() ; //later, you can use cout << o3 ; system("pause"); return 0; 20

Call by reference class Coord { 優點? Coord operator+(const Coord& c) ; void operator=(const Coord& c) ; ; Coord Coord::operator+(const Coord& c) { void Coord::operator=(const Coord& c) { 因為 operator+ 傳回 temp, 接著 operator= 以參考接收, 所以第二個 Coord c 必須要加上 const, 以防止修改到原本應已消滅的物件空間之值 21

課堂練習 Call by reference (3_reference.cpp) 將運算子函數的傳入引數改為 reference int main() { Coord o1(10,10), o2(5,3), o3; o3=o1+o2; // o3 = o1 + o2 ; o3.print(); //later, you can use cout << o3 ; system("pause"); return 0; 22

連加與連等 o4 = o1+o2+o3; o4.operator=(o1+o2+o3); o4.operator=(o1.operator+(o2+o3)); o4.operator=(o1.operator+(o2.operator+(o3))); o1=o2=o3; o1.operator=(o2=o3); o1.operator=(o2.operator=(o3)); 23

連加與連等 Coord operator+(coord c) { // 原 add() Coord temp ; temp.x = x + c.x ; temp.y = y + c.y ; return temp ; o1.operator+(o2+o3); void operator=(coord c) { // 原 set() x = c.x; y=c.y; 24 Coord Coord::operator=(Coord c) { x = c.x; y=c.y; return *this; o1.operator=(o2=o3);

課堂練習 連等連加 (3_ContAdd.cpp) int main() { Coord o1(10,10), o2(5,3), o3(3,2),o4,o5 ; o5=o4=o1+o2+o3; // o3 = o1 + o2 ; o5.print() ; //later, you can use cout << o3 ; system("pause"); return 0; 25

多載邏輯與關係運算子 二元運算子 (Binary Operators) 算術運算 : +, -, *, /, =, +=, -=,., 關係運算 : >, <, >=, <=, == 邏輯運算 : &&,, &,, ^ 26

範例 (1/2) class Coord { int x, y ; Q: o1==o2 的真面目? public: Coord() {x = 0 ; y=0 ; Coord(int i, int j) { x=i; y=j; bool operator==(const Coord& ob2) ; ; int main() { Coord o1(10,10); o2(5,3) ; if (o1 == o2) cout << o1 == o2 <<endl ; return 0; 27

範例 (2/2) bool Coord::operator==(const Coord& ob2) { return (this->x==ob2.x) && (this->y==ob2.y); 28

課堂練習 == 多載 (3_Logic.cpp) int main() { Coord o1(10,10), o2(3,5), o3; if (o1==o2) cout<<"o1==o2"<<endl; else cout<<"o1!=o2"<<endl; system("pause"); return 0; 29

多載一元運算子 一元運算子 ++, --, +, - 需求 int main() { Coord o1(10, 10), o2 ; o2 = ++o1 ; o1.print() ; o2 = o1++ ; o1.print() ; return 0; o1.operator++() // 前置 ++, prefix // 後置 ++, postfix 30

如何分辨 prefix 與 postfix ++ class Coord { int x, int y; public: Coord(){ Coord(int a, int b){x=a; y=b; Coord& operator++() { // prefix ++ ++o1 ; x++; y++ ; return *this; 僅用來區別 ++ 或 -- 在後面, 參數值沒有特殊意義 Coord operator++(int) {//postfix ++ Coord temp = *this ; x++; y++ ; return temp ; o1++ ; Q: 為何不寫 void operator++()? 31

Operator ++ 的真面目 ++d1 d1.operator++() Date &operator++() d1++ d1.operator++(0) Date operator++(int) 32

課堂練習 ++ (3_AddAdd.cpp) int main() { Coord o1(10,10),o2; cout<<"o1="; o1.print(); 33 cout<<"o2=o1++"<<endl; o2=o1++; cout<<"o2="; o2.print(); cout<<"o1="; o1.print();... return 0;

使用夥伴運算子函數 源起 o3 = o1+o2 ; o3 = o1.operator+(o2) ; o3 = o1+5 ; o3 = o1.operator+(5) ; o3 = 10 + o2 ; o3 = 10.operator+(o2);????? 使用夥伴函數來定義運算子! 34

夥伴運算子函數 #include<iostream.h> class Coord { int x, y ; ; Coord operator+(coord ob1, Coord ob2) { return Coord(ob1.x+ob2.x, ob1.y+ob2.y) ; void main() { Coord o1(10,10), o2(5, 3), o3; o3 = o1 + o2 ; 參考 operator+(coord, Coord) Q1: 是否為 class Coord 的成員? Q2: 可否取用 x, y? friend Coord operator+(coord ob1, Coord ob2) ; 35 // o3 = operator+(o1, o2) ;

36 10+o2 的解決 class Coord{ int x, y ; public: Coord(){x=0;y=0; Coord(int a){x=a;y=a; Coord(int a, int b){x=a;y=b; friend Coord operator+(coord ob1, Coord ob2); void print(){cout<<x<<y<<endl; ; Coord operator+(coord ob1, Coord ob2) { return Coord(ob1.x+ob2.x, ob1.y+ob2.y) ; int main() { Coord o1(10,10), o2(5, 3), o3; o3 = 10 + o2 ; // It s OK, why? return 0; 實際練習看看!

注意 operator+() 只接收 1 或 2 個參數 1 個參數 : 成員函數 2 個參數 : 一般函數 37

多載 << 與 >> 運算子 << 與 >> 運算子 可供內建資料型態使用 可供使用者自訂類別多載使用 多載 << 運算子 左邊的運算元必須是型態 ostream& 例如 : cout<< ob1 多載 >> 運算子 左邊的運算元必須是型態 istream& 例如 : cin >> ob1 多載這兩個運算子必須使用非成員函式 38

多載 << 運算子範例 函數原型 寫在自訂類別定義中!!! friend ostream &operator<<( ostream&, const PhoneNumber& ); 39 函數定義 ostream &operator<<( ostream& output, const PhoneNumber &num ) { output << ( << num.areacode <<") " << num.exchange << "-" << num.line; return output; // enables cout<< a << b << c; // end function operator<< 函數呼叫 1. operator<<( cout, phone ); 2. cout << phone; // 輸出一個電話號碼

課堂練習 修改 3_OutputOverloading.cpp 中的 print() 成員函數 void Coord::print() { cout<<"("<<x<<","<<y<<")"<<endl; 改為多載 << 運算子 o3.print(); cout << o3 << endl; 40