15:06:48 第五章运算符重载 本章主要内容 1.运算符重载的目的 2.运算符重载的两种形式:成员函数和友元函数 3.一元运算符的重载 重点 4.二元运算符的重载 重点 5.不允许重载的运算符 6.运算符重载的一般规则 重点
15:06:48 第五章 运算符重载 本章主要内容 1. 运算符重载的目的 2. 运算符重载的两种形式:成员函数和友元函数 3. 一元运算符的重载 —— 重点 4. 二元运算符的重载 —— 重点 5. 不允许重载的运算符 6. 运算符重载的一般规则 —— 重点
5:06:48 数据类型总是与相关的运算相联系的 对类来说,一般情况下,调用类中提供的成员函数完成对 该类的对象的操作,但对某些类来说,这种方式显得很不 自然,不符合日常的思维习惯 例:复数加法 class complex[ loat real, image; public Complex(floa 0 i=0 存在的问题 复数在数学上有很规范的运算和运算符,但本类中用成员画 数而不是使用数学上的运算符代表对复数进行的数学运算, 显得很不自然,不符合人的思维习惯 改进: 对复数类提供重载的运算符 resu e dd (rig
15:06:48 –数据类型总是与相关的运算相联系的 –对类来说,一般情况下,调用类中提供的成员函数完成对 该类的对象的操作,但对某些类来说,这种方式显得很不 自然,不符合日常的思维习惯 例:复数加法 class Complex{ float real,image; public: Complex(float r=0,float i=0); Complex(const Complex & c); Complex Add(const Complex & right); }; void main(){ Complex left(1,2),right(3,4); Complex result; result=left.Add(right); } 存在的问题: 复数在数学上有很规范的运算和运算符,但本类中用成员函 数而不是使用数学上的运算符代表对复数进行的数学运算, 显得很不自然,不符合人的思维习惯 改进: 对复数类提供重载的运算符
5:06:48 运算符重载 通过在类中建立运算符函数( operator function)实现 声明运算符函数的一般形式为 返回值类形 operator运算符(形参运算量列表); 例;复数的加法 class complex float real, image, public Complex (float r=0, float i=0) Complex (const Complex c Complex operator +(const Complex right) void maino[ Complex left(1, 2), right(3, 4) Complex result: result left right
15:06:48 运算符重载 通过在类中建立运算符函数(operator function)实现 声明运算符函数的一般形式为 返回值类形 operator 运算符(形参运算量列表); 例:复数的加法 class Complex{ float real,image; public: Complex (float r=0,float i=0); Complex (const Complex & c); Complex operator +(const Complex & right); }; void main(){ Complex left(1,2),right(3,4); Complex result; result = left + right; }
15:06:48 关于运算符重载的说明 运算符重载的目的是为了语法上的方便,使用户尽可能以 符合日常思维或比较自然的方式编写程序 运算符重载的实质是改变运算符本来的含义,使对特定数 据类型的数据进行这种运算时,调用该运算符对应的函数 运算符重载是针对特定类的对象之间的运算的,基本数据 类型(如int, float等)的变量之间进行的运算不能重载 运算符重载没有也不能改变该运算符的优先级与结合性 只能重载已存在的运算符,不能通过重载的方式创造新的运 算符,也不能改变该运算符的操作数数目 运算符重载有两种形式:成元函数与友元函数 以下几个运算符不能被重载 sizeof *(指针运算符) 重载运算符时,该运算实现什么操作完全取决于类的设计者 (函数体由类的设计者实现),但一般应参照该运算符本来的意 义,否则会引起语法或使用上的混乱
15:06:48 关于运算符重载的说明 ➢运算符重载的目的是为了语法上的方便,使用户尽可能以 符合日常思维或比较自然的方式编写程序 ➢运算符重载的实质是改变运算符本来的含义,使对特定数 据类型的数据进行这种运算时,调用该运算符对应的函数 重载运算符时,该运算实现什么操作完全取决于类的设计者 (函数体由类的设计者实现),但一般应参照该运算符本来的意 义,否则会引起语法或使用上的混乱 ➢运算符重载是针对特定类的对象之间的运算的, 基本数据 类型(如int,float等)的变量之间进行的运算不能重载 ➢运算符重载没有也不能改变该运算符的优先级与结合性 ➢只能重载已存在的运算符,不能通过重载的方式创造新的运 算符,也不能改变该运算符的操作数数目 ➢运算符重载有两种形式:成元函数与友元函数 ➢以下几个运算符不能被重载 sizeof . *(指针运算符) :: ? :
15:06:48 一元运算符的重载 元运算本身需要一个操作数 可重载成成员函数,也可重载成友元函数 成员函数:形式上无参数,操作数即为this指针指向的对象 友元函数:形式上带有一个参数,该参数即为操作数 例:一元运算符的重载 //友元函数 //成员函数 class Byte class Integer int b int 1; public: public: Byte(int bb=0) Integer(int ii=0) void showo: void showo friend Byte operator+( Integer operator+o const byte bt) Integer operator-0; friend Byte operator-( const Byte& bt)
15:06:48 一元运算符的重载 ➢一元运算本身需要一个操作数 ➢可重载成成员函数,也可重载成友元函数 ➢成员函数:形式上无参数,操作数即为this指针指向的对象 ➢友元函数:形式上带有一个参数,该参数即为操作数 例:一元运算符的重载 //成员函数 class Integer{ int i; public: Integer(int ii=0); void show(); Integer operator+(); Integer operator-(); }; //友元函数 class Byte{ int b; public: Byte(int bb=0); void show(); friend Byte operator+( const Byte & bt); friend Byte operator-( const Byte & bt); };
5:06:48 实现 友元函数 //成员函数 Byte:: Byte(int bb) Integer:: Integer(int ii) [b=bb; 1 [i=ii void Byte: showo void Integer:: showO [ cout < b << end1 [ cout < i < end1; 1 Byte operator+( Integer Integer: operator+O const byte& bt) freturn *this; 1 return bt Integer Integer: operator-o( Byte operator-( Integer temp(i) const byte bt)i return temp: Byte temp(-bt b return temp
15:06:48 实现 //成员函数 Integer::Integer(int ii) { i=ii;} void Integer::show() { cout << i << endl;} Integer Integer::operator+() {return *this;} Integer Integer::operator-(){ Integer temp(-i); return temp; } //友元函数 Byte::Byte(int bb) { b=bb;} void Byte::show() { cout << b << endl;} Byte operator+( const Byte & bt) {return bt;} Byte operator-( const Byte & bt){ Byte temp(-bt.b); return temp; }
15:06:48 元运算符重载的特例:++ ++与一有前置与后置(即先++、先一和后++、后-)两种形式 为了区别这两种形式,重载时对应的函数形式有所不同 例: Integer类 成员函数:以+为例 Integer Integer: operator /+0 + class Integer return *this. int 1 public Integer Integer: operator++(int) Integer operator++0;( Integer operator++Kint): Integer temp this return temp Integer intObj(10) ++intob j 前置形式 后置形式 intob j++
15:06:48 一元运算符重载的特例:++ 、-- ➢++与--有前置与后置(即先++、先--和后++、后--)两种形式 ➢为了区别这两种形式,重载时对应的函数形式有所不同 例:Integer类 .成员函数:以++为例 class Integer{ int i; public: Integer operator++(); Integer operator++(int); }; Integer Integer::operator ++(){ i++; return *this; } Integer Integer::operator++(int) { Integer temp = *this; i++; return temp; } 前置形式 后置形式 Integer intObj(10); ++intObj; intObj++;
友元函数 15:06:48 class Byte int b public friend Byte operator++(Byte& bt) friend By te operator++(B bt. int) Byte operator++ byte bt bt b++. 前置形式 return bt. Byte operator+t byte bt, int) Byte temp=bt; bt b++ 后置形式 return tem p Byte btobirO) ++btob btob++
15:06:48 .友元函数 class Byte{ int b; public: friend Byte operator++(Byte & bt); friend Byte operator++(Byte & bt,int); }; Byte operator++(Byte & bt){ bt.b++; return bt; } Byte operator++(Byte & bt,int){ Byte temp=bt; bt.b++; return temp; } Byte btObj(10); ++btObj; btObj++; 前置形式 后置形式
5:06:48 二元运算符的重载 二元运算本身需要两个操作数 有些二元运算符既可重载成成元函数,也可重载成友元函数 成员函数:形式上需要一个形参,此形参做为右操作数, 左操作数为this指针指向的对象 友元函数:形式上需要两个形参,分别代表左操作数和右 操作数
15:06:48 二元运算符的重载 ➢二元运算本身需要两个操作数 ➢有些二元运算符既可重载成成元函数,也可重载成友元函数 ➢成员函数:形式上需要一个形参,此形参做为右操作数, 左操作数为this指针指向的对象 ➢友元函数:形式上需要两个形参,分别代表左操作数和右 操作数
5:06:48 例:复数类 class complex float real, image, public: Complex(float r=0, float i=0)real=r; image=i Complex operator +(const Complex right friend Complex opera tor -(const Complex left const Complex & right) ComplexComplex:: operator +(const Complex right)t Complex temp(real+right. real, image+right image) eturn t emt° Complex c1(1,2),c2(3,4); Complex c3=c1 +c2 Complex c4=c1-c2 注意: 元运算符重载对应的成员函数由左操作数调用,意即 c1+c2 c1 operator+(c2)
15:06:48 例:复数类 class Complex{ float real,image; public: Complex(float r=0,float i=0){real=r;image=i;} Complex operator +(const Complex & right); friend Complex operator -(const Complex & left, const Complex & right); }; Complex Complex::operator +(const Complex & right){ Complex temp(real+right.real, image+right.image); return temp; } Complex operator-(const Complex& left, const Complex& right){ Complex temp(left.real-right.real, left.image-right.image); return temp; } Complex c1(1,2),c2(3,4); Complex c3 = c1 + c2; Complex c4 = c1 – c2; 注意: 二元运算符重载对应的成员函数由左操作数调用,意即 c1+c2 c1.operator+(c2)