PowerPoint Presentation

Similar documents
運算子多載 Operator Overloading

Microsoft Word - caa2.doc

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

前言

<4D F736F F D20CAD9C3FCCAC7D7D4BCBAD2BBB5E3D2BBB5CEC5ACC1A6C0B4B5C4A1AAA1AA41342E646F63>

c_cpp

Microsoft PowerPoint - string_kruse [兼容模式]

Chapter12 Derived Classes

運算子多載 Operator Overloading

Microsoft Word - 2CA13內文.doc

Strings

FY.DOC

穨japhkesch.PDF

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

issue27.indd

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

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

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

ebook39-5

運算子多載 Operator Overloading

文档 3

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

Microsoft Word - ch04三校.doc

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

新版 明解C++入門編

Strings

NethersoleJO89(8).indd

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

生死之交

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

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

Microsoft Word cppFinalSolution.doc

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

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

Template

Java 程式設計入門

untitled

第八﹑九章 I/O系統


untitled

<4D F736F F F696E74202D20A9F6B867A452A8F6BB50A565C25F2DBE47BC79AA5A2DBCC6A6ECB1D0A7F72E BACDBAE65BCD2A6A15D>

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

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

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

0660

<4D F736F F D203033C8ABC8D5D6C6B1BEA1A2D7A8BFC6C9FAD1A7B7D6D6C6D1A7BCAEB9DCC0EDB9E6B6A82E646F63>

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

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

<4D F736F F D20BDADCBD5CAA1B9A9CFFABACFD7F7D7DCC9E7BCF2B1A8B5DA3239C6DA2E646F63>

<4D F736F F D20C3F1D3C3BBFAB3A1BDA8C9E8B9DCC0EDB9E6B6A8B7A2B2BCB8E52E646F63>

慈宗彌勒淨土法門的殊勝

5.1施工企业会计核算办法

論文全.doc

专科疾病诊治(十二)


untitled



文档2


<4D F736F F D203234A8E2A9A4B142ABC3AABAB7C5B1A1ADB1BB50AA6BA8EEADB1>

<4D F736F F D20A2B0A1D0A2B0A1D0A2B0A240A6CBAA4FC554BC4DB7ABA240A7D6AA4FBD6DB2DF2E646F63>

Microsoft Word 薪酬管理制度.doc

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

Az b.doc

PowerPoint 簡報

ex

<4D F736F F D20AC4FBDBDA4FBB67DA96CAABA2DA743A67EAFC5AAA95FA7B9BD5A5F2E646F63>

ebook39-6

今天 年春季号 总 92 期

*

( ) / / / / / / /

(Microsoft Word - 8\244T\244\362\277\337\272]\244W\265L\246W.doc)

Microsoft Word - 專家本色 doc


但, 你 应 该 听 过 我 们 走 在 大 路 上 这 首 歌, 或 许 还 知 道 革 命 人 永 远 是 年 轻 那 支 歌 ; 并 且, 几 乎 可 以 肯 定, 你 在 戴 红 领 巾 的 那 阵, 必 然 唱 过 牛 儿 还 在 山 坡 吃 草, 放 牛 的 却 不 知 道 哪 儿 去

2 临 终 助 念 答 问 序 临 终 关 怀, 由 佛 门 净 宗 古 来 祖 师 大 德 提 倡 助 念 往 生, 现 今 已 渐 为 社 会 大 众 所 重 视, 在 台 湾, 台 大 长 庚 等 各 大 医 院, 也 都 设 有 助 念 室 ; 大 陆 上 许 多 道 场, 也 有 专 为

校园之星

<4D F736F F F696E74202D FA8BEA861B8EAB7BDBEE3A658BB50C0B3A5CE28B773A6CBA5AB29>


之 原 則 及 國 防 部 訂 頒 國 軍 列 管 國 有 不 動 產 提 供 非 軍 方 單 位 使 用 處 理 原 則 規 定 不 符, 仍 應 以 出 租 方 式 辦 理 惟 可 就 偏 遠 地 區 提 供 官 兵 金 融 水 電 服 務 使 用 部 分, 研 議 降 低 租 金 標 準, 報

chineseall

釋禪波羅蜜次第法門

证券代码: 证券简称:锦江股份 公告编号:【】

1700 装 卸 搬 运 7645 装 卸 搬 运 服 务 2100 建 筑 7410 工 程 服 务 11% 装 卸 搬 运 服 务, 是 指 使 用 装 卸 搬 运 工 具 或 者 人 力 畜 力 将 货 物 在 运 输 工 具 之 间 装 卸 现 场 之 间 或 者 运 输 工 具 与 装 卸

前 言 教 育 无 小 事, 它 成 就 着 学 生 的 未 来 作 为 教 师, 他 们 无 时 无 刻 不 在 关 注 着 学 生 的 成 长 学 生 的 未 来 学 生 就 像 一 朵 含 苞 待 放 的 花 朵, 需 要 老 师 们 的 细 心 呵 护, 给 学 生 需 要 的 东 西, 而

《盗墓笔记》 南派三叔/著

<CFFBB7D1D5DFD0D0CEAAD1A72E6D7073>

独立学院建设与发展


Microsoft Word - 澎湖田調報告-宏達組9804.doc

平 凡 足 迹 李 本 川 作 者 为 中 国 科 学 院 海 洋 研 究 所 研 究 员,1935 年 生, 山 东 荣 成 人 我 今 年 63 岁 了 大 前 年 丈 夫 和 儿 子 在 一 个 月 内 先 后 离 开 了 人 世, 女 儿 又 已 出 嫁, 现 在 是 孑 然 一 身 我 是

第十章 虛擬函數 (Virtual Functions)

1

01






Transcription:

第六章簡介運算子超載 (Operator Overloading) 6-1 運算子超載的基礎 6-2 超載二元運算子 6-3 超載邏輯與關係運算子 6-4 超載一元運算子 6-5 使用夥伴函數 6-6 細部檢視指定運算子 6-7 超載註標運算子

6-1 運算子超載的基礎 甚麼是運算子超載? 讓運算子 ( 符號 ) 有不同的意義 EX: 運算子的預設意義 ( 以 + 與 = 為例 ) class frac { ; 可以重新定義 +, +, = 運算子應用 void main() { 在 frac 物件上的意義嗎? 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, 可乎?

如果沒有運算子超載能力 void main() { frac f1(3,5), f2(2, 5), f3 ; f3.set(f1.add(f2)) ; // 模擬 f3 = f1 + f2 ; if (f1.great_equal(f2)) // f1 >= f2 cout << f1 >= f2 ; cout<< f3= ; f3.print() ; // cout << f3= <<f3 ; 也 OK? 缺點? 你的看法

如何超載運算子 在類別中建立運算子函數 (operator functions) 語法 class classname { // overload 運算子 X return-type operatorx(arg-list) {

運算子的種類 二元運算子 (Binary Operators) EX: 5 + 3, 5>=3 算術運算 : +, -, *, /, =, +=, -=,., 關係運算 : >, <, >=, <= 邏輯運算 : &&,, &,, ^ 一元運算子 a++, --b, -c, +d 其他 [], (), new, delete, ->,?:

6-2 超載二元運算子 範例一 class coord { int x, y ; ; void main() { coord o1(10,10), o2(5,3), o3 ; o3 = o1 + o2; // o3 (15, 13) o3.print() ; //later, you can use cout << o3 ;

超載運算子 +, = class coord { int x, y ; ; void 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 ;

超載 operator+, = 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 = this->x + c.x ; temp.y = this->y + c.y ; return temp ; void set(coord c) { this->x = c.x; this->y=c.y; void print(){cout<<x<<y<<endl; ; o3.set(o1.add(o2)) ; o3.set(o1.add(o2)) ; temp <= o1.add(o2) ; temp <= o1.add(o2) ; o3 <= temp ; o3 <= temp ;

void main() { coord o1(10,10), o2(5,3), o3 ; 超載 operator+, = // // 原 o3.set(o1.add(o2)); o3.operator=(o1.operator+(o2)); class coord { coord operator+(coord c) { // 原 add() coord temp ; temp.x = this->x + c.x ; temp.y = this->y + c.y ; return temp ; void operator=(coord c) { // 原 set() this->x = c.x; this->y=c.y; ;

void main() { coord o1(10,10), o2(5,3), o3 ; 超載 operator+, // // 原 o3.set(o1.add(o2)); = // // o3.operator=(o1.operator+(o2); class coord { o3 = o1 + o2 ; coord operator+(coord c) { // 原 add() coord temp ; temp.x = this->x + c.x ; temp.y = this->y + c.y ; return temp ; void operator=(coord c) { // 原 set() this->x = c.x; this->y=c.y; ;

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

回憶如何超載運算子 在類別中建立運算子函數 (operator functions) 語法 class classname { // overload 運算子 X return-type operatorx(arg-list) {

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

Yet Another Operator+ class coord { coord operator+(const coord& ob2) { return coord(x+ob2.x, y+ob2.y) ; ;

範例二 : 承範例一 新增減號 - 改善 operator= 的功能 (later)

範例三 : 需求 void main() { coord o1(10,10), o2(5, 3), o3 ; o3 = o1 + 2 ; Q: o3=o1 +2 的真面目?

範例三 ( 續 ) class coord { int x, y ; public: void main() { coord o1(10,10), o2(3,5), o3 o3 ; o3 o3 = o1 o1 + 2 ; // // o3 o3 = o1.operator+(2) ; coord() { x=y=0 ; coord(int a) { x = a; y = 0 ; coord(int a, int b) {x=a; y=b; coord operator+(coord c) {

範例四 : 請使用 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) {

習題 class frac { int u, d ; public: // 定義 +, -, *, /, % = 運算子 ;

連加與連等 連加, OK? o4 = o1+o2+o3 ; 連等, OK? 參考範例二 o1=o2=o3;

習題 為 frac 加入 +=, -=, *=, /=

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

範例一 : class coord { Q: o1==o2 的真面目? int x, y ; public: coord() {x = 0 ; y=0 ; coord(int i, int j) { x=i; y=j; bool operator==(const coord& ob2) ; bool operator&&(const coord& ob2) ; ; void main() { coord o1(10,10); o2(5,3) ; if (o1 == o2) cout << o1 == o2 <<endl ; if (o1 && o2) cout << as you wish. <<endl ;

範例一 ( 續 ) bool coord::operator==(const coord& ob2) { return (this->x==ob2.x) && (this->y==ob2.y);

習題 : 替 frac 加上 ==, >, <, >=, <= 運算子

6-4 超載一元運算子 一元運算子 ++, --, +, - 需求 : void main() { coord o1(10, 10), o2 ; o1.operator++() o2 = ++o1 ; o1.print() ; // 前置 ++, prefix o2 = o1++ ; o1.print() ;// 後置 ++, postfix

範例一 : 前置 ++ class coord { int x, y ; public: coord operator++() { Q1: 為何不寫 void operator++()? Q1: 為何不寫 void operator++()? x++; y++ ; return *this;

範例二 : 如何分辨 prefix 與 postfix ++ class coord { int x, y; public: coord(){ coord(int a, int b){x=a; y=b; coord& operator++() { // prefix ++ x++; y++ ; return *this; coord operator++(int) {//postfix ++ coord temp = *this ; x++; y++ ; return temp ; ++o1 ; ++o1 ; o1++ ; // // 解釋函數內容

範例三 : 超載負號 class coord { coord& operator-() { x = -x; y =-y; return *this; coord operator-(const coord& c) { ; 這樣的 operator- 對嗎? try try o1 o1 = -o2 ; // // o2(10,10)

習題 : class frac 加入 ++, --, -

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

範例一 : 記起來 參考 operator+(coord, coord) Q1: 是否為 class coord 的成員? Q2: 可否取用 x, x, y? #include<iostream.h> class coord { friend int x, y coord ; operator+(coord ob1, coord ob2) ; ; 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 ; // o3 = operator+(o1, o2) ;

範例二 : 10+ob2 的解決 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) ; void main() { coord o1(10,10), o2(5, 3), o3; o3 = 10 + o2 ; // It s OK, why?

範例三 : 自己看 一元運算符號的負載 使用 friend functions

很多個 class 的 operator+ class coord { ; class frac { ; coord operator+(coord ob1, coord ob2) ; frac operator+(frac ob1, frac ob2) ; void main() { coord o1(10,10), o2(5,3), o3; o3 = o1 + o2 ; // 呼叫哪一個 operator+ frac f1(5,3), f2(2,7), f3; f3 = f1 + f2 ;

定義二元運算子函數的常態 class frac { Q: Q: operator= 需要用此種方式嗎? // 將以下之外部函數宣告成朋友函數 ; frac operaotr+(const frac& f1, const frac& f2) { frac operaotr-(const frac& f1, const frac& f2) { frac operaotr*(const frac& f1, const frac& f2) { frac operaotr/(const frac& f1, const frac& f2) { bool operaotr==(const frac& f1, const frac& f2) { bool operaotr>(const frac& f1, const frac& f2) {

6-6 細部檢查指定運算子 operatr= 要不要有回傳值? void operaotr=(const coord& ob); o1 = o2 = o3 ; // o1 = (o2=o3) ; o1.operator=(o2.operator=(o3)) ; 那要回傳什麼? 那要回傳什麼?

operator= 的回傳值 class coord { coord operator=(const coord& ob) { x = ob.x ; y = ob.y ; return ob ;

operator= 的回傳值 class coord { coord& operator=(const coord& ob) { x = ob.x ; y = ob.y ; return ob ;

operator= 的回傳值 class coord { coord& operator=(const coord& ob) { x = ob.x ; y = ob.y ; return *this ; this x y.

operator= 的內容 class coord { coord& operator=(const coord& ob) { x = ob.x ; y = ob.y ; return *this; ; Q1: 不寫 operator= 會不會怎樣? 如 o1 = o2 ; bit-wise copy Q2: 那寫這個幹嘛? 當成員中有 pointer 時

範例一 class strtype { 與 copy constructor 幾乎相同!! char *p; int len ; ; strtype& strtype::operator=(const strtype&ob){ if (&ob == this) return ; // what means? if (len < ob.len) { delete[] p; p = new char[ob.len+1] ; len = ob.len ; strcpy(p, ob.p) ; return *this ;

6-7 超載註標運算子 需求 class SafeArray { int a[50] ; ; void main() { SafeArray s ; 但我可否使用 : cout << s[10]; s[10] = 77 77 ; cout << s.get(10) ; // cout << s.a[10] ; s.insert(10, 77) ; // s.a[10] = 77 ;

operator[] SafeArray s ; cout << s[10] ; // cout << s.operator[](10) ; s[10] = 77 ; // s.operator[](10) = 77 ; 奇怪, 怎麼會有寫在等號右邊的函數? 奇怪, 怎麼會有寫在等號右邊的函數?

可寫在等號右邊的函數 int buffer ; int& get_buffer() ; void main() { get_buffer() = 10 ; cout << get_buffer() <<endl ; int& get_buffer() { return buffer ;

可寫在等號右邊的函數 const int SIZE = 20 ; int a[size] ; int& getelement(int index) { return a[index] ; void main() { getelement(5) = 100 ; // a[5] = 100 ; cout << getelement(5) <<endl ;

安全的陣列 class SafeArray { int a[20] ; public: int& operator[](int index) { if(index<0 index >19) {cout<< out of boundary <<endl; exit(1); else {return a[index]; // DIY, 檢查 index 的範圍 void main() { SafeArray sa; sa[5] = 10 ; cout << sa[5] ; EX: void main() { SafeArray sa(20) ;

class Frac 完成了沒?