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

Similar documents
Microsoft PowerPoint - string_kruse [兼容模式]

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

PowerPoint Presentation

Strings

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式]

PowerPoint Presentation

c_cpp

北京大学

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

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

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

Strings

untitled

新版 明解C++入門編

untitled

无类继承.key

Microsoft Word - ch04三校.doc

1.加入党组织主要经过哪些程序?

穨japhkesch.PDF

FY.DOC

【结构化面试名师精品班2ATY15K002】讲义.docx

Chapter12 Derived Classes

内 容 提 要 指 针 持 久 动 态 内 存 分 配 字 符 串 ( 字 符 数 组 ) 2

Microsoft PowerPoint - 10 模板 Template.pptx

Microsoft PowerPoint - 04-Inheritance.ppt

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.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

Microsoft Word - chap10.doc

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

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

untitled

NethersoleJO89(8).indd

Microsoft Word - 新正文.doc

Microsoft PowerPoint - 第06讲_继承.ppt [兼容模式]

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

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

提问袁小兵:

材 料 目 录 1. 党 员 发 展 及 转 正 流 程 图 2. 申 请 入 党 人 员 基 本 信 息 及 培 养 记 录 表 3. 思 想 汇 报 传 阅 及 意 见 反 馈 表 4. 入 党 积 极 分 子 培 养 考 察 表 5. 政 治 审 查 函 调 信 模 板 6. 政 治 审 查

ebook55-13

程序设计语言及基础

3.1 num = 3 ch = 'C' 2

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

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

ebook39-5

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

運算子多載 Operator Overloading

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

土 木 与 交 通 学 院 发 展 学 生 党 员 的 选 拨 条 件 与 推 荐 细 则 为 进 一 步 规 范 我 院 学 生 党 建 工 作, 加 强 和 完 善 我 院 对 学 生 党 员 各 个 阶 段 人 员 的 选 拔 和 培 养 工 作, 提 高 我 院 发 展 学 生 党 员 质

幻灯片 1

023 深 圳 市 融 信 软 件 技 术 有 限 公 司 SZ 深 圳 市 深 博 泰 生 物 科 技 有 限 公 司 SZ 深 圳 市 移 付 宝 科 技 有 限 公 司 SZ 深 圳 市 奥 金 瑞 科 技 有 限 公 司 SZ

Microsoft PowerPoint - 07 派生数据类型

Guava学习之Resources

Microsoft PowerPoint - L17_Inheritance_v4.pptx

Microsoft Word cppFinalSolution.doc

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

全国计算机技术与软件专业技术资格(水平)考试

合 并 业 务 范 围 相 近 的 企 业 资 质, 合 理 设 置 资 质 标 准 条 件, 注 重 对 企 业 人 员 信 用 状 况 质 量 安 全 等 指 标 的 考 核, 强 化 资 质 审 批 后 的 动 态 监 管 ; 简 政 放 权, 推 进 审 批 权 限 下 放, 健 全 完 善

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

針灸治療膝關節疼痛綜述

why

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

untitled

反 馈 问 题 1 请 申 请 人 对 比 同 行 业 上 市 公 司 资 产 负 债 率 有 息 负 债 率 等 指 标, 分 析 说 明 本 次 偿 还 银 行 借 款 的 必 要 性 和 合 理 性 其 中, 部 分 拟 偿 还 的 银 行 借 款 为 流 动 资 金 借 款, 请 说 明 通

運算子多載 Operator Overloading

安徽电子工程学校

Microsoft Word - 01.DOC

1.5招募说明书(草案)

C++ 程式設計

書本介紹


幻灯片 1

2013年度西藏自治区教育厅

實用文格式大全.doc

个 小 小 的 乡 下 人 木 匠 的 儿 子, 竟 然 有 这 么 大 的 力 量 其 实 就 是 这 点, 祂 活 出 来 的 那 种 爱, 是 世 界 上 没 有 的 祂 活 出 来 的 爱 是 世 界 上 的 人 都 需 要 的, 但 却 是 人 人 在 这 个 世 界 上 都 得 不 到

薛 秦 高 继 宁 宋 明 锁 文 洪 梁 瑞 敏 贾 跃 进 内 蒙 古 自 治 区 (3 人 ) 琪 格 其 图 米 子 良 赵 震 生 辽 宁 省 (8 人 ) 田 素 琴 白 凤 鸣 肖 瑞 崇 黄 恩 申 白 长 川 杨 世 勇 李 敬 林 王 秀 云 吉 林 省 (5 人 ) 赵 继 福

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

目 录 专 稿 季 烨 文 革 之 初 北 京 师 大 二 附 中 的 红 色 暴 力 姜 培 良 之 死 与 仇 恨 教 育 评 论 唐 燕 关 于 北 京 女 十 中 教 师 孙 迪 之 死 给 王 友 琴 纠 错 校 史 王 逸 伦 编 辑 合 肥 市 第 六 中 学 校 史 关 于 文 革

来 正 式 组 织 关 系 转 出 后 未 收 到 组 织 关 系 介 绍 信 回 执 的 党 员 排 查 的 主 要 任 务 是, 核 查 党 员 身 份 信 息, 摸 清 流 动 党 员 底 数, 理 顺 党 员 组 织 关 系, 健 全 完 善 党 员 档 案, 对 与 党 组 织 失 去 联

Microsoft Word - 1HF12序.doc

Microsoft Word - 讀報看科普─人體篇_橫_.doc

Microsoft Word - 2B802內文.doc

鍟嗗搧瑙傚療鈥㈤挗鏉

席 远 杨 一 人 了, 正 当 她 开 枪 时 却 发 现 子 弹 没 了 该 死, 只 能 赤 手 空 拳 了 洛 水 云 与 席 远 杨 交 起 手 来, 洛 水 云 出 手 招 招 致 命 想 那 席 远 杨 也 不 是 泛 泛 之 辈, 很 快 掌 握 了 洛 水 云 出 招 路 数 看

東區校園中法治教育種子師資教學研習營

閱 讀 素 材 V.S 分 組 方 式 的 差 異 化 教 學 工 具 表 班 級 :( ) 閱 讀 素 材 V.S 分 組 方 式 獨 立 閱 讀 夥 伴 閱 讀 ( 同 質 性 ) 夥 伴 閱 讀 ( 異 質 性 ) 友 善 陪 伴 虛 心 受 教 國 語 日 報 新 聞 生 活 文 藝 兒 童

生命科学学院 学年度学风建设实施方案

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft Word yildin kiyinki Jonggoning Shinjianggha bolghan hokumiranliqi

概述


2

第二章

Microsoft Word - 送報伕2.doc

图 文 聚 焦 国 培 计 划 (2013) 甘 肃 省 农 村 小 学 音 乐 骨 干 教 师 短 期 集 中 培 训 9 月 4 日 开 班 了, 学 员 老 师 们 从 甘 肃 省 各 个 县 市 州 汇 聚 湖 南 一 师, 开 始 了 为 期 14 天 的 培 训 学 习 : 鲜 明 的

Microsoft Word - 三方协议书与接收函的相关说明学生版.doc

邻居啊 第二天 对门却悄无声息了 莫非昨夜的吵闹 仅是个幻觉 夜幕拉下时 寒风又吱溜溜地叫个不停 老婆 睡下后 我这只夜猫子 继续兴致勃勃地跟着福尔 摩斯去探案 白天的喧嚣退去了 周围格外安静 正 是读书的好时候 突然 响起了钟摆声 哒 哒 哒 节奏匀称 不疾不徐 声响却愈来愈大 格外突兀 了 原来

<4D F736F F D BAC520CAD7B6BCCAA6B7B6B4F3D1A C4EAD7A8D2B5BCBCCAF5D6B0CEF1C6C0C6B8B9A4D7F7D2E2BCFB2E646F63>

Transcription:

运算符重载 Operator Overloading

class Point { public: ; double x_, y_; Why Operator Overloading? Point (double x =0, double y = 0):x_(x),y_(y) { int main(){ Point a(1., 2), b(3,4); Point c = a + b; return 0;

class Point { public: ; double x_, y_; Why Operator Overloading? Point (double x =0, double y = 0):x_(x),y_(y) { int main(){ Point a(1., 2), b(3,4); Point c = a + b; return 0; error: no match for 'operator+' (operand types are 'Point' and 'Point') Point c = a + b;

可重载的运算符 What Can I Overload? Algorithm +, -, *, /, %, ^, &,, ~,!, =, +=, -=, *=, /=, %=, ^=, &=, =, &&,, ++, --, Comparison!=, ==, <, <=, >, >= Access [ ], *,->, ( ), Stream <<, >>, >>=, <<= Scary New, delete, New[], delete[],,

Operator Overloading 允许我们对新类型重新定义 == 等运算符的新含义. 当且仅当两点的 x, y 坐标分别相等. 如何重载一个运算符? 两种方式 : Member function syntax Free function syntax

Operator Overloading 允许我们对新类型重新定义 == 等运算符的新含义 class Point { public: double x_, y_; Point (double x =0, double y = 0):x_(x),y_(y) { bool operator== (const Point& rhs){ return (x == rhs.x && y == rhs.y); ;

int main(){ Point p1(3, 2); Point p2(3, 2); if (p1 == p2) cout << Points are equal! << endl; return 0;

int main(){ Point p1(3, 2); Point p2(3, 2); if (p1. operator== p2) cout << Points are equal! << endl; return 0;

Free Function Syntax bool operator==(point l, Point r) { return l.x == r.x && l.y == r.y; int main(){ Point p1(3, 2); Point p2(3, 2); if (p1 == p2) cout << Points are equal! << endl; return 0;

Free Function Syntax Point operator*(double l, Point r) { Point result(l * r.x, l * r.y); return result; int main(){ Point p(1, 1); Point result = 5 * p; result.print(); // prints (5, 5) return 0;

Free Function Syntax bool operator==(point l, Point r) { return l.x == r.x && l.y == r.y; int main(){ Point p1(3, 2); Point p2(3, 2); if (operator== (p1, p2) ) cout << Points are equal! << endl; return 0;

class Point { public: ; double x_, y_; Operator Overloading Point (double x =0, double y = 0):x_(x),y_(y) { Point operator+ (Point Q){ return Point( x_+ Q.x_, y_+ Q.y_);

class Point { public: ; double x_, y_; Operator Overloading Point (double x =0, double y = 0):x_(x),y_(y) { Point operator+ (Point P, Point Q){ return Point( P.x_+ Q.x_, P.y_+ Q.y_);

二元运算符 @ 可解释为 aa.operator@(bb), 或 operator@(aa,bb) 可以定义为取一个参数的非静态成员函数, 也可以定义为两个参数的非成员函数 当左操作数不是类类型时, 则必须为非成员函数 class X{ ; public: void operator+(int); X(int); void operator=(x,x); void operator=(x,double); void f(x a){ a+2; 2.operator+(a); a+2.5

一元运算符 @ 可解释为 aa.operator@(), 或 operator@(aa)

++i vs i++ int i = 1; // i = 1 int j = i++; // j = 1, i = 2 int k = ++i; // k = 3, i = 3

class foo { // Define ++foo foo operator++() { // Define foo++ foo operator++(int) { ++i vs i++ int i = 1; // i = 1 int j = i++; // j = 1, i = 2 int k = ++i; // k = 3, i = 3

Cautions: 运算符定义不能违背约定的语法 如不能将一元运算符定义为二元的或三元的 class X { ; X* operator&() ; // 一元取地址 X operator&(x) ; // 二元 与 X operator++(int) ; // 后缀增量 X operator&(x,x) ; // error: ternary X operator/() ; // error: unary /

Cautions: 运算符定义不能违背约定的语法 // nonmember functions : X operator-(x) ; // prefix unary minus X operator-(x,x) ; // binary minus X operator--(x&,int) ; // postfix decrement X operator-(); // error: no operand X operator-(x,x,x) ; // error: ternary X operator%(x) ; // error: unary %

Other Cautions 其他注意点 重载运算符不能有缺省参数 除 operator= 外, 重载运算符被派生类所继承 重载运算符的第一个参数一定是该类或派生类类型 如 point p; 3.+=p; // 错!

Other Cautions 其他注意点 = [] () -> 必须是非静态成员函数 为防止误用运算符 ( 如 =, &,,), 可以通过定义私有运算符函数, 将它们设为私有 class X { private: ; void operator=(const X&) ; void operator&() ; void operator, (const X&) ; //... void f(x a, X b){ a = b; &a; a, b;

赋值运算符 = 下标运算符 [] 类成员访问运算符 -> 类型转换运算符 T() 函数调用运算符 () 几种特殊运算符 增量与减量运算符 ++,--

赋值运算符 = class String{ char *s; int sz; public: String() {s = 0; sz = 0; String( const char *str); ; String::String(const char *str){ sz = strlen(str); s= new char[sz+1]; strcpy(s,str); void f(){ String s1 = Li,s2; s2 = s1; 拷贝构造函数 赋值运算符

赋值运算符 = class String{ char *s; int sz; public: ; String() {s = 0; sz = 0; String( const char *str); String& operator= (String &T); String & String::operator= (String &T){ sz = strlen(t.s); s= new char[sz+1]; strcpy(s,t.s); 拷贝构造函数 void f(){ String s1 = Li,s2; s2 = s1; 赋值运算符

赋值运算符 = 拷贝构造函数与赋值运算符的区别 : 拷贝构造函数在定义一个对象时被调用, 而赋值运算符用一个对象对另一个对象赋值 class X { X(int); ; void f() { X x, y; X z = x; // 拷贝构造 y = z; // 赋值运算符 x = 3; // 类型转换 + 赋值运算符

下标运算符 [] class String{ char *s; int sz; public: // char& operator[](int i){ return s[i]; ; void f(){ String s1 = Li, s2; S1[1] = L ; S1[3] = T ;

类成员访问运算符 -> 二元运算符, 其第一操作数是指向类类型的指针. 其第二个操作数是该类的成员 class String{ char *s; int sz; public: // int size(){return sz; ; Void f(){ String s = Li,*p; int n = s.size(); p = &s; n = p->size();

类型转换运算符 T() 带参数的构造函数相当于从参数类型到该类类型的类型转换 String(const char *str); 类也可以定义类型转换运算符将该类对象转换为其他类型的对象 如 class A{ ; operator int(){;

类型转换运算符 T() 当一个类同时定义了一个参数 (t 类型 ) 的构造函数和一个 t 类型的类型转换函数时, 有时会引起歧义 class A{ A( int ); operator int(); friend A operator+ (const A& a1,const A& a2); ; A a; int i = 1,z; z= a+i; //bad z = (int)a +i; 或 z= a +(A)i

函数调用运算符 () 函数调用 () 使得类对象可以当场一个函数来使用 如 class Matrix{ double operator()( int i, int j ); //double get( int i, int j); ; Matrix M; double s = M(1,2) ; double s = M.get(1,2);

友元 friend Complex 类 class complex{ / / very simplified complex double re, im; public: complex(double r, double i) : re(r), im(i) { friend complex operator+ (const complex &a, const complex &b) ; friend complex operator* (const complex &a, const complex &b) ; // ; 类的友元函数可以访问该类对象的私有数据

友元 friend Complex 类 complex operator+ (const complex &a, const complex &b) { return Complex( a.re + b.re, a.im + b.im ) ; ; 类的友元函数可以访问该类对象的私有数据

作业 实现相对完整的 Complex String Matrix 类