第10章运算符重载 10.1什么是运算符重载 10.2运算符重载的方法 10.3重载运算符的规则 10.4运算符重载函数作为类成员函数和友元函数 10.5重载双目运算符 10.6重载单目运算符 10.7重载流插入运算符和流提取运算符 10.8不同类型数据间的转换
第10章 运算符重载 10.1 什么是运算符重载 10.2 运算符重载的方法 10.3 重载运算符的规则 10.4 运算符重载函数作为类成员函数和友元函数 10.5 重载双目运算符 10.6 重载单目运算符 10.7 重载流插入运算符和流提取运算符 10.8 不同类型数据间的转换
10.1什么是运算符重载 函数重载就是对一个已有的函数赋予新的含义, 使之实现新功能 运算符重载就是给运算符赋予新的功能。 譬如,定义一个专门的函数,来实现用“+” 号进行两个复数的相加
10.1 什么是运算符重载 函数重载就是对一个已有的函数赋予新的含义, 使之实现新功能 运算符重载就是给运算符赋予新的功能。 譬如,定义一个专门的函数,来实现用“+” 号进行两个复数的相加
例10.1通过函数来实现复数相加。 #include using namespace std; 定义Complex类 class Complex public: 定义构造函数 Complex(){real-0;imag-0;) Complex(double r,double i) 构造函数重载 {real=r;imag-i;} Complex complex add(Complex &c2); void display()左 声明复数 相加函数 private: 声明输出函数 double real; double imag;
例10.1 通过函数来实现复数相加。 #include using namespace std; class Complex {public: Complex( ){real=0;imag=0;} Complex(double r,double i) {real=r;imag=i;} Complex complex_add(Complex &c2); void display( ); private: double real; double imag; }; 定义Complex类 定义构造函数 构造函数重载 声明复数 相加函数 声明输出函数
Complex Complex:complex add(Complex &c2) {Complex c; c.real-=real+c2.real; 运行结果如下: c.imag-=imag+c2.imag; c1=(3+4i) return c; c2=(5-10i) c1+c2=(8,-6i) void Complex:display() {cout<<"("<<real<<","<<imag<<"i)"<<endl;} int main() 定义3个复数对象 {Complex c1(3,4),c2(5,-10),c3; c3=c1.complex add(c2); 调用复数相加函数 cout<<"cl=",cl.display())方 cout<<"c2-"c2.display(), 输出cl、c2、c3的值 cout<<"c1+c2=";c3.display() return 0;
Complex Complex∷complex_add(Complex &c2) {Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c; } void Complex∷display( ) {cout<<″(″<<real<<″,″<<imag<<″i)″<<endl;} int main( ) {Complex c1(3,4),c2(5,-10),c3; c3=c1.complex_add(c2); cout<<″c1=″; c1.display( ); cout<<″c2=″; c2.display( ); cout<<″c1+c2=″; c3.display( ); return 0; } 运行结果如下: c1=(3+4i) c2=(5-10i) c1+c2=(8,-6i) 定义3个复数对象 调用复数相加函数 输出c1、c2、c3的值
例1:一个日期类对象加上若干天数,应该仍 是日期 Date d1(2001,12,1): 即运算:d1=d1+10;是合理的 应能得到:2001/12/11 8 C++的语法问题:“+”运算的操作数是什么? 定义了对内部 int “十 数据类型进行算术运算 char float、double
例1:一个日期类对象加上若干天数,应该仍 是日期 Date d1(2001,12,1); 即运算: d1=d1+10; 是合理的 C++的语法问题: “+”运算的操作数是什么? “+” int char float、double 数据类型进行算术运算 定义了对内部 应能得到:2001/12/11
例2:字符串相加操作 Char a[1o]=“Hello “ Char b[10]="World"; Char c[20]=a+b; 通过运算符重载实现 对象的运算操作: 严重的语法问题: 1.运用类机制 1.类型不一致; 2.a+b无意义 2.重载运算符 3. “十”不作串连接运 3.保持运算符概念上 倍 的一致性
例2:字符串相加操作 Char a[10]=“Hello “; Char b[10]=“World”; Char c[20]=a+b; 严重的语法问题: 1. 类型不一致; 2. a+b无意义 3. “+”不作串连接运 算 通过运算符重载实现 对象的运算操作: 1. 运用类机制 2. 重载运算符 3. 保持运算符概念上 的一致性
10.2运算符重载的方法 定义一个重载运算符的函数 运算符重载的方法是 在需要执行被重载的运算符 时,系统就自动调用该函数 运算符重载实质上是函数的重载 重载运算符的函数一般格式如下: type class_name::operator @(type op_data) 运算后的 运算符函数 被重载的 运算符的另一 返回值 所属的类 运算符 操作数和类型 Complex类(复数)的加法运算,函数的原型 双目运算符 Complex operator+(Complex&c1); 带一个参数, 单目运算符 不带参数
10.2 运算符重载的方法 运算符重载的方法是 运算符重载实质上是函数的重载 重载运算符的函数一般格式如下: Complex类(复数)的加法运算,函数的原型 Complex operator+ (Complex& c1); 定义一个重载运算符的函数 在需要执行被重载的运算符 时,系统就自动调用该函数 type class_name::operator @(type op_data) 被重载的 运算符 运算符的另一 操作数和类型 运算符函数 所属的类 运算后的 返回值 双目运算符 带一个参数, 单目运算符 不带参数
定义重载运算符的函数后,函数operator+重载了运算符+ #include 例10.1程序的基础上 using namespace std; 重载运算符“+”, class Complex 使之用于复数相加。 public: Complex Complex()real-0;imag-0; Complex:operator+ Complex(double r,double i) (Complex &c2) freal=r;imag-i;} Complex c; Complex operator+(Complex &c2) c.real=real+c2.real; void display()月 c.imag-imag+c2.imag; private: return c; double real; double imag; 定义重载运 算符的函数
定义重载运算符的函数后,函数operator+重载了运算符+ 例10.1程序的基础上 重载运算符“+” , 使之用于复数相加。 #include using namespace std; class Complex {public: Complex( ){real=0;imag=0;} Complex(double r,double i) {real=r;imag=i;} Complex operator+(Complex &c2); void display( ); private: double real; double imag; }; Complex Complex∷operator+ (Complex &c2) { Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c; } 定义重载运 算符的函数
void Complex:display() {cout<<"("<<real<<"," <<imag<<"i)"<<endl; 运算符+用于复数运算 int main() {Complex c1(3,4),c2(5,-10),c3: c3=c1+c2; 运行结果: cout<<"c1=";c1.display(); c1=(3+4i) cout<<"c2=";c2.display() c2=(5-10i) cout<<"c1+c2=";c3.display() c1+c2=(8,-6i return 0;
void Complex∷display( ) { cout<<″(″<<real<<″,″ <<imag<<″i)″<<endl; } int main( ) { Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; cout<<″c1=″;c1.display( ); cout<<″c2=″;c2.display( ); cout<<″c1+c2=″;c3.display( ); return 0; } 运行结果: c1=(3+4i) c2=(5-10i) c1+c2=(8,-6i) 运算符+用于复数运算
比较例10.1和例10.2,两处不同: (1)在例10.2中operator+函数 +complex add函数 只是函数名不同,函数体和函数返回值的类型都是相同的 (2)在main函数中 c3=c1+c2;-c3=c1.complex add(c2); C++编译系统将程序中的表达式c1+c2解释为 c1.operator+(c2) 其中cl和c2是Complex类的对象 operator-+(Complex&c2)进行求值 得到两个复数之和
比较例10.1和例10.2,两处不同: 只是函数名不同,函数体和函数返回值的类型都是相同的 (2) 在main函数中 c3=c1+c2; c3=c1.complex_add(c2); C++编译系统将程序中的表达式c1+c2解释为 c1.operator+(c2) 其中c1和c2是Complex类的对象 (1) 在例10.2中 operator+函数 complex_add函数 operator+(Complex &c2) 进行求值 得到两个复数之和