华东师范大学数学科学学院 目录页 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); }
实现方式一:成员函数 运算符重载可以通过成员函数实现 ●运算符重载为成员函数时,形参个数少一个: 目的对象自动作为第一个操作数/左操作数 ●如果是单目运算,无需形参(后置+和后置--除外) 优点:可以自由访问本类的数据成员 若是双目运算,则左操作数就是目的对象本身 若是单目运算,则目的对象就是操作数,不需要其它对象 http://math.ecnu.edu.cn/~jypan 7
http://math.ecnu.edu.cn/~jypan 7 实现方式一:成员函数 运算符重载可以通过成员函数实现 运算符重载为成员函数时,形参个数少一个: 目的对象自动作为第一个操作数/左操作数 如果是单目运算,无需形参(后置 ++ 和后置 -- 除外) ►优点:可以自由访问本类的数据成员 ►若是双目运算,则左操作数就是目的对象本身 ►若是单目运算,则目的对象就是操作数,不需要其它对象
例:有理数的加法 ex12_overload_member_01.cpp class Rational public: Rational(){x=0;y=1; Rational(int x,int y){this->x=x;this->y=y; Rational operator+(const Rational p); private: int x,yi }; RationalRational:operator+(const Rational&p) int newx x*p.yy*p.x; int newy y*p.y; return Rational(newx,newy); http://math.ecnu.edu.cn/~jypan 8
http://math.ecnu.edu.cn/~jypan 8 例:有理数的加法 class Rational { public: Rational() { x=0; y=1; } Rational(int x, int y) { this->x=x; this->y=y; } Rational operator+(const Rational & p); private: int x, y; }; Rational Rational::operator+(const Rational & p) { int newx = x*p.y + y*p.x; int newy = y*p.y; return Rational(newx, newy); } ex12_overload_member_01.cpp
实现方式一:成员函数(续》 口双目运算符的重载(成员函数) 对象AO对象B 类型说明符operator⊙(const类名&); 声明 类型说明符类名:operator⊙(const类名&p) →定义 {函数体;} (假定在类外部定义) 注意:只有一个形参(对象) http://math.ecnu.edu.cn/~jypan 9
http://math.ecnu.edu.cn/~jypan 9 实现方式一:成员函数(续) 双目运算符的重载(成员函数) 声明 定义 类型说明符 operator⊙(const 类名 &); 对象A ⊙ 对象B 类型说明符 类名::operator⊙(const 类名 & p) { 函数体; } (假定在类外部定义) † 注意:只有一个形参(对象)
实现方式一:成员函数(续) 口前置单目运算符的重载(成员函数)(如:-、!、+、--) O对象A 类型说明符operator⊙(); 声明 类型说明符类名:operatorO() →定义 {函数体;} (假定在类外部定义) 注意:没有形参 http://math.ecnu.edu.cn/~jypan 10
http://math.ecnu.edu.cn/~jypan 10 实现方式一:成员函数(续) 前置单目运算符的重载(成员函数)(如:-、!、++、--) 声明 定义 类型说明符 operator⊙(); ⊙对象A 类型说明符 类名::operator⊙() { 函数体; } (假定在类外部定义) † 注意:没有形参
实现方式一:成员函数(续) ▣ 后置单目运算符的重载(成员函数)( 如:++、-) 对象AO 类型说明符 operator⊙(int); 声明 类型说明符类名::operator⊙(int dummy) 定义 {函数体;} (假定在类外部定义) 十注意:带一个整型形参,该形参在运算中不起任何作用, 只用于区分前置和后置,因此也称为伪参数。 http://math.ecnu.edu.cn/~jypan 11
http://math.ecnu.edu.cn/~jypan 11 实现方式一:成员函数(续) 后置单目运算符的重载(成员函数)(如:++、--) 声明 定义 类型说明符 operator⊙(int); 对象A⊙ 类型说明符 类名::operator⊙(int dummy) { 函数体; } (假定在类外部定义) † 注意:带一个整型形参,该形参在运算中不起任何作用, 只用于区分前置和后置,因此也称为伪参数