面向对象程序设计语言C第章运算符重载.ppt
《面向对象程序设计语言C第章运算符重载.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计语言C第章运算符重载.ppt(79页珍藏版)》请在三一文库上搜索。
1、面向对象程序设计语言C+,电子科技大学计算机学院,1,第五章 运算符重载,当在使用一种程序设计语言编写程序时,我们不仅要设计新的数据类型,同时还要为新类型设计运算。一般地,用户定义类型的运算都是用函数的方式实现的。 而在一般情况下,一种类型的运算都是用运算符表达的,这很直观,语义也简单。 但是如果直接将运算符作用在用户定义类型之上,那么编译器将不能识别运算符的语义。因此,在这种情况下,我们需要一种特别的机制来重新定义作用在用户定义类型上的普通运算符的含义。这就是运算符重载的简单概念。,2,第五章 运算符重载,其实在C编译器里早就存在简单的运算符重载的概念了。考虑整型和浮点型两种加法运算: in
2、t a = 1, b; b = a + 2; float c = 1.0, d; d = c + 2.0; 在上面的两条加法语句中,都用到了运算符“+”。这符合我们数学常识。但对于C编译器来说,这两个加法却被翻译成不同的指令。这就是说,“+”运算符至少具有两种不同的解释(实现代码)。此时我们说, “+”运算符被重载了。遗憾的是,C仅支持很少量的运算符重载。,3,第五章运算符重载,C+扩充了C运算符重载的功能,允许已存在的预定义运算符在不同的上下文中做出不同的解释。 当两个字符串类进行连接的时候,我们可能用到这样的方式: class String public: String string_ca
3、t(String); ; String str1, str2, str3; str3 = str1.string_cat(str2);,4,第五章运算符重载,显然,这不如 str3 = str1 + str2 简单明了。 但问题是,C+编译器只知道+运算符是作用在整型和浮点型数据之上的,它不知道在上述表达式中+运算符的确切含义。 因此,在设计类String时,我们必须增加“+”运算符的含义。这样一来,语义变得更加清晰和易懂。,5,第五章 引论,在原来预定义的运算符含义的基础上,再增加对于某个用户定义类型的对象进行操作的新的含义。这就是运算符重载。 运算符重载后,其优先级和结合性不变。,6,第五
4、章 引论,考虑复数的加法运算: class Complex double re, im; public: Complex(double r, double im) re=r; im=i; Complex() re = 0.0; im = 0.0; Complex add_Complex(Complex c) Complex temp; temp.re = re + c.re; temp.im = im + c.im; return temp; ;,7,/整个函数体也可简化为 return Complex(re+c.re, im+c.im);,第五章 引论,void main( ) Comple
5、x obj1(1,2),obj2(3,4); Complex obj3=obj1.add_Complex(obj2); 能不能将2个复数相加表示为:obj1+obj2 呢?,9,第五章 引论,5.1 重载运算符 C+提供了一种将标准定义的运算符用在用户自定义类型上的方法,称为运算符重载。 C+约定,如果一个成员函数的函数名字是特殊的,即由关键字operator加上一个运算符构成,如operator+。 obj1.operator+(obj2) 称为函数operator+()的显示调用形式; obj1+obj2称为函数operator+()的隐式调用形式; 函数operator+()称为运算符重
6、载函数。,10,第五章 引论,考虑复数的加法运算: class Complex double re, im; public: Complex(double r, double im) re=r; im=i; Complex() re = 0.0; im = 0.0; Complex operator+ (Complex c) Complex temp; temp.re = re + c.re; temp.im = im + c.im; return temp; ;,11,第五章 引论,5.1 重载运算符 void main( ) Complex obj1(1,2),obj2(3,4); Com
7、plex obj3=obj1.+obj2; obj1+obj2 等价于: obj1.operator+(obj2),12,第五章 引论,5.1.1运算符重载的语法形式 在C+中,运算符通过一个运算符重载函数进行重载。运算符重载可以采用成员函数和友元函数两种重载方式,语法形式如下: (1)运算符重载函数为成员函数的语法形式为: type Class_Name:operator(参数表) /相对于Class_Name类而定义的操作 其中,type是返回类型,“”是要重载的运算符符号,Class_Name是重载该运算符的类的类名,函数名operator。,13,第五章 引论,5.1.1运算符重载的语
8、法形式 (2)运算符重载函数为友元函数的语法形式为: type operator(参数表) /相对于该类而定义的操作 ,14,第五章 引论,5.1.2 重载运算符规则 (1) 只有少数的C+语言的运算符不能重载: : # ?: . .*,15,第五章 引论,5.1.2 重载运算符规则 (2)只能对已有的C+运算符进行重载。 (3)重载运算符时,不能改变它们的优先级,不能改变它们的结合性,也不能改变这些运算符所需操作数的数目。 (4)重载运算符的函数不能有默认的参数,否则就改变了运算符所需要的操作数的数目。,16,第五章 引论,5.1.2 重载运算符规则 (5)重载的运算符必须和用户自定义类型的
9、对象一起使用,其参数至少应用一个是类对象(或类对象的引用)。 (6)用于类对象的运算符一般必须重载,有两个运算符:赋值运算符=和地址运算符&可以不必重载,17,第五章 引论,5.1.2 重载运算符规则 (7)重载运算符时,可以让运算符执行任意的操作, 比如将运算符重载为运算 但这样违背了运算符重载的初衷,降低程序可读性,使人无法理解程序功能。 因此,应当使重载运算符的功能类似于该运算符作用于标准类型数据时所实现的功能。 如果不能建立运算符的这种习惯用法,应该采用函数调用方法,以免造成阅读困难(除非程序员故意如此)。,18,第五章 引论,5.1 重载运算符 5.1.3 一元和二元运算符 1.一元
10、运算符 一元运算符,不论是前缀还是后缀,都需要一个操作数。 暂时不区分前缀和后缀的重载,(5.1.5节:前缀和后缀重载的区别)。,19,第五章 引论,5.1.3 一元和二元运算符 对任意一元运算符,有: (1)成员函数重载运算符 type Class_Name:operator( ) 设obj为Class_Name的类对象,则: 显式调用方式: obj.operator() 隐式调用方式: obj 或者 obj,20,成员函数,Complex Complex:operator!() Complex temp; temp.re=-re; temp.im=-im; return temp; ,第五
11、章 引论,5.1.3一元和二元运算符 (2)友元函数重载运算符 type operator(Class_Name Cobj) 显式调用方式: operator(obj) 隐式调用方式: obj 或者 obj (例5-5/6),22,友元函数,Complex operator!(const Complex ,第五章 引论,5.1.3一元和二元运算符 2.二元运算符 (1)成员函数重载运算符 type Class_Name:operator(Class_Name Cobj) 显式调用方式: obj1.operator(obj2) 隐式调用方式: obj1 obj2,24,第五章 引论,5.1.3一
12、元和二元运算符 (2)友元函数重载运算符 type operator ( Class_Name Cobj1,Class_Name Cobj2) 显式调用方式: operator (obj1,obj2) 隐式调用方式: obj1 obj2 (例5-7/8),25,成员函数,Complex Complex :operator+( const Complex ,友元函数,Complex operator+(const Complex ,第五章 引论,5.1.3一元和二元运算符 3运算符重载为成员函数和友元函数的选择建议,28,第五章 引论,5.1 重载运算符 5.1.4 重载+和-的前缀和后缀方式
13、以+为例: 对于前缀方式+obj: 成员函数重载 Class_Name Class_Nam:operator+( ); 友元函数重载 Class_Nam operator+(Class_Nam ,29,成员函数,Complex ,第五章 引论,5.1 重载运算符 5.1.4 重载+和-的前缀和后缀方式 对于后缀方式obj+: 成员函数重载 Class_Nam Class_Nam:operator+(int); 友元函数重载 Class_Nam operator+(Class_Nam 这时,第二个参数(int)只是一个占位符号,用来区分该重载函数是前缀方式还是后缀方式,在函数内部不需要也不能使用
14、。通常用0表示。(例5-11/12),31,有元函数,Complex ,第五章 引论,5.1 重载运算符 5.1.5 重载赋值运算符 赋值运算符“=”可以被重载,用户可以定义自己需要的重载“=”的运算符重载函数。重载了的运算符函数operator=不能被继承,而且它必须被重载为成员函数,一般重载格式为: X X:operator=(const X & from) /复制X的成员 拷贝构造函数和赋值运算符都是把一个对象的数据成员拷贝到另一对象。它们的区别是,拷贝构造函数要创建一个新对象,而赋值运算符则是改变一个已存在的对象的值。(例5-13),33,第五章 引论,5.1.6重载运算符( )和 运
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计语言 运算 重载
链接地址:https://www.31doc.com/p-2264901.html