华东师范大学数学科学学院 目录页 School of Mathematical Sciences,ECNU Contents 1 运算符重载 2 自动类型转换 http://math.ecnu.edu.cn/-jypan
http://math.ecnu.edu.cn/~jypan 目录页 Contents 华东师范大学 数学科学学院 School of Mathematical Sciences, ECNU http://math.ecnu.edu.cn/~jypan 1 2 运算符重载 自动类型转换
运算符重载 ■ 为什么要“运算符重载” ■ 哪些运算符可以重载 ■ 如何实现运算符重载 ■ 实现方式:成员函数与非成员函数 ■ 重载[]与左值 http://math.ecnu.edu.cn/~jypan 3
http://math.ecnu.edu.cn/~jypan 3 运算符重载 为什么要“运算符重载” 哪些运算符可以重载 如何实现运算符重载 实现方式:成员函数与非成员函数 重载 [] 与左值 1
为什么要运算符重载 预定义的运算符只针对基本数据类型,若要对类的对象进行类 似的运算,需要通过运算符来实现。 ▣ 运算符重载实质就是函数重载: 对已有的运算符赋予多重含义,使得同一个运算符作用于 不同类型的数据时表现出不同的行为。 例:对不同数据进行加法运算,如何实现? int x=1,y=2,z; z=×+y5 //普通数据类型的加法 String str1("hello"),str2("Math"),str3; str3=str1+str2;/String类对象的加法 Point A(1,2),B(3,4),C; C=A+B; /Point类对象的加法 http://math.ecnu.edu.cn/~jypan 4
http://math.ecnu.edu.cn/~jypan 4 为什么要运算符重载 预定义的运算符只针对基本数据类型,若要对类的对象进行类 似的运算,需要通过运算符来实现。 运算符重载实质就是函数重载: int x=1, y=2, z; z = x + y; // 普通数据类型的加法 String str1("hello"), str2("Math"), str3; str3 = str1 + str2; // String 类对象的加法 Point A(1,2), B(3,4), C; C = A + B; // Point 类对象的加法 例:对不同数据进行加法运算,如何实现? —— 对已有的运算符赋予多重含义,使得同一个运算符作用于 不同类型的数据时表现出不同的行为
运算符重载基本规则 ●只能重载已有的运算符 ●重载不改变运算符的优先级和结合率 ●运算符重载不改变运算符的操作数的数目 ●重载的功能通常与已有的功能类似 ●运算符重载是针对新类型数据(类与对象)的需要, 因此至少有一个操作数是新类型数据 不能被重载的四个运算符: 。米 http://math.ecnu.edu.cn/~jypan 5
http://math.ecnu.edu.cn/~jypan 5 运算符重载基本规则 只能重载已有的运算符 重载不改变运算符的优先级和结合率 运算符重载不改变运算符的操作数的数目 重载的功能通常与已有的功能类似 运算符重载是针对新类型数据(类与对象)的需要, 因此 至少有一个操作数是新类型数据 不能被重载的四个运算符: . .* :: ?:
如何实现运算符重载 ▣定义运算符重载的一般形式 类型说明符operator:运算符(形参列表) {函数体; }//在类的声明中定义 类型说明符类名:operator运算符(形参列表) {函数体;}//假定在外部定义 这里的类型说明符可以是类名或基本数据类型 Complex Complex:operator+(Complex c2) return Complex(real+c2.real,imag+c2.imag); http://math.ecnu.edu.cn/~jypan 6
http://math.ecnu.edu.cn/~jypan 6 如何实现运算符重载 类型说明符 operator运算符(形参列表) { 函数体; } // 在类的声明中定义 定义运算符重载的一般形式 类型说明符 类名::operator运算符(形参列表) { 函数体; } // 假定在外部定义 † 这里的类型说明符可以是类名或基本数据类型 Complex Complex::operator+(Complex & c2) { return Complex(real+c2.real, imag+c2.imag); }