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); };