第11章运算符重载ppt课件.ppt
《第11章运算符重载ppt课件.ppt》由会员分享,可在线阅读,更多相关《第11章运算符重载ppt课件.ppt(84页珍藏版)》请在三一文库上搜索。
1、第11章 运算符重载,什么是运算符重载 运算符重载的方法 几个特殊的运算符的重载 自定义类型转换运算符 运算符重载实例,什么是运算符重载,使系统内置的运算符可以用于类类型 例如:+ 运算符能够实现2个对象间的加。例如:类A的对象a1、a2、a3,希望: a3 = a1 + a2; 即:分别把对象a1和a2的各个数据成员值对应相加,然后赋给对象a3。,问题的提出,把某些事交给系统去做,用户只要知道相加就可 扩充运算符的功能 增强了C+ 语言的可扩充性 使用户定义的类更像系统的内置类型,运算符重载的限制,不是所有的运算符都能重载 重载不能改变运算符的优先级和结合性 重载不能改变运算符的操作数个数
2、不能创建新的运算符,可以重载的运算符,+ - * / % & | ! = += -= *= /= %= = &= |= = = & | + - -* , - () new delete new delete,不能重载的运算符,. .* : ?: sizeof,第11章 运算符重载,什么是运算符重载 运算符重载的方法 几个特殊的运算符的重载 自定义类型转换运算符 运算符重载实例,运算符重载的方法,运算符重载就是写一个函数解释某个运算符在某个类中的含义 要使得系统能自动找到重载的这个函数,函数名必须要体现出和某个被重载的运算符的联系。 C+中规定,重载函数名为 operator 其中,为要重载的运
3、算符。如要重载“+”运算符,该重载函数名为operator+。要重载赋值运算符,函数名为operator=。,函数原型,运算符的重载不能改变运算符的运算对象数。因此,重载函数的形式参数个数(包括成员函数的隐式指针this)与运算符的运算对象数相同 运算符重载可以重载成成员函数也可以重载成全局函数实现。重载成全局函数时,最好把此函数设为友员函数 如果作为类的成员函数,它的形式参数个数比运算符的运算对象数少1。这是因为成员函数有一个隐含的参数this。在C+中,把隐含参数this作为运算符的第一个参数。 当把一个一元运算符重载成成员函数时,该函数没有形式参数。 把一个二元运算符重载成成员函数时,该
4、函数只有一个形式参数,就是右操作数,当前对象是左操作数。,重载实例,为rational类增加“+”和“*”以及比较的重载函数,用以替换现有的add和multi函数,方案一:重载成成员函数,class Rational private: int num; int den; void ReductFraction(); public: Rational(int n = 0, int d = 1) num = n; den = d; Rational operator+(const Rational ,函数实现,Rational Rational:operator+(const Rational ,
5、bool Rational:operator(const Rational ,方案二:重载成友员函数,class Rational friend Rational operator+(const Rational ,函数的实现,Rational operator+(const Rational 其他函数实现略,重载后有理数类的使用,int main() Rational r1(1,6), r2(1,6), r3; r3 = r1 + r2; r1.display(); cout “ + “; r2.display(); cout “ = “; r3.display(); cout endl;
6、r3 = r1 * r2; r1.display(); cout “ * “; r2.display(); cout “ = “; r3.display(); cout endl; return 0; ,全局函数 vs成员函数,大多数运算符都可以重载成成员函数或全局函数。 赋值(=)、下标()函数调用()和成员访问(-)必须重载成成员函数。 具有赋值意义的运算符,如复合的赋值运算符以及+和-,不一定非要定义为成员函数,但最好定义为成员函数。 具有两个运算对象的运算符最好重载为全局函数,这样可以使得应用更加灵活。如果把加运算定义成全局函数,r是有理数类的对象,则2+r是一个合法的表达式。,第11
7、章 运算符重载,什么是运算符重载 运算符重载的方法 几个特殊的运算符的重载 自定义类型转换运算符 运算符重载实例,几个特殊的运算符的重载,赋值运算符 下标运算符 函数调用运算符 +和运算符的重载 重载函数的原型设计考虑 输入输出运算符重载,赋值运算符,对任一类,如果用户没有自定义赋值运算符函数,那么系统为其生成一个缺省的赋值运算符函数,在对应的数据成员间赋值。 一般情况下,这个缺省的赋值运算符重载函数能满足用户的需求。但是,当类含有类型为指针的数据成员时,可能会带来一些麻烦。,对DoubleArray类对象执行 array1 = array2的问题,会引起内存泄漏 使这两个数组的元素存放于同一
8、块空间中 当这两个对象析构时,先析构的对象会释放存储数组元素的空间。而当后一个对象析构时,无法释放存放数组元素的空间,赋值运算符“=”的原型,赋值运算符只能重载成成员函数 函数原型: X &X:operator=(const X &source) / 赋值过程 一旦创建了对象x1, x2, 可以用 x1 = x2赋值。,DoubleArray类的 赋值运算符重载函数,DoubleArray ,赋值运算符重载要点,一般来讲,需要自定义拷贝构造函数的类也需要自定义赋值运算符重载函数。 在赋值运算符重载函数中,已经将参数的值赋值给了当前对象,那为什么还需要返回值呢?记住,在C+中,赋值是一个运算,它
9、可以形成一个表达式,而该表达式的结果值就是赋给左边的对象的值。因此,赋值运算符重载函数必须返回赋给左边的对象值。,赋值运算符重载和拷贝构造函数,一般来讲,需要拷贝构造函数的类也需要重载赋值运算符 定义对象时给对象赋初值调用的是拷贝构造函数 程序的语句部分中的赋值语句调用的是赋值运算符重载函数,几个特殊的运算符的重载,赋值运算符 下标运算符 函数调用运算符 +和运算符的重载 重载函数的原型设计考虑 输入输出运算符重载,下标运算符重载,能否象普通的数组那样通过下标运算操作DoubleArray类的对象,这样可以使DoubleArray类更像一个功能内置的数组。 可以通过重载下标运算符()来实现 下
10、标运算符是二元运算符,第一个运算数是数组名,第二个运算数是下标值 下标运算符必须重载成成员函数,DoubleArray类的 重载,double ,DoubleArray类的使用,定义:DoubleArray array(20, 30); 数组输入: for (i=20; i arrayi; 数组输出: for (i=20; i=30; +i) cout arrayi t;,几个特殊的运算符的重载,赋值运算符 下标运算符 函数调用运算符 +和运算符的重载 重载函数的原型设计考虑 输入输出运算符重载,函数调用运算符,函数调用运算符()是一个二元运算符。它的第一个运算对象是函数名,第二个参数是形式参
11、数表。运算的结果是函数的返回值。 一个类重载了函数调用运算符,就可以把这个类的对象当做函数来使用,函数调用运算符重载,函数调用运算符必须重载成成员函数 函数调用运算符重载函数的原型为 函数的返回值 operator() (形式参数表);,函数调用运算符重载实例,在DoubleArray类增加一个功能:取数组中的一部分元素形成一个新的数组 例如,在一个下标范围为10到20的数组arr中取出下标为第12到15的元素,形成一个下标范围为2到5的数组存放在数组arr1中,可以调用 arr1 = arr(12, 15, 2)。,DoubleArray operator()(int start, int
12、end, int lh) if (start end | start high ) cout “下标越界“; exit(-1); DoubleArray tmp(lh, lh + end - start); for (int i = 0; i end - start + 1; +i) tmp.storagei = storagestart + i - low; return tmp; ,几个特殊的运算符的重载,赋值运算符 下标运算符 函数调用运算符 +和运算符的重载 重载函数的原型设计考虑 输入输出运算符重载,“+”和“-”重载,、- -:是一元操作符 这两个操作符可以是前缀,也可以是后缀。而
13、且前缀和后缀的含义是有区别的。所以,必须有两个重载函数。 问题:两个重载函数有相同的原型 区分方法: 前缀:一元操作符。 后缀:二元操作符。,“+”和“-”重载 cont.,成员函数重载 +ob重载为:ob.operator+() ob- 重载为:ob.operator-(int) 友元函数重载 +ob重载为:operator+(X &ob) ob-重载为:operator-(X &ob, int) 调用时,参数int一般传递给值0。,+、-重载实例,设计一个会报警的计数器类。该计数器从0开始计数,当到达预先设定好的报警值时,计数器会发出报警消息,计数器的值不再增加。,类定义,class Co
14、unter int value; /计数器的值 int alarm; /报警值 public: Counter(int a) value = 0; alarm = a; Counter ,类实现,Counter /返回修改前的状态 ,类的使用,int main() Counter cnt(3); /定义一个Counter类的对象,报警值为3 cnt.print(); /显示对象的当前值,此时输出为0 +cnt; cnt.print(); / 此时输出为1 (+cnt).print(); /调用前缀的+,输出2 (cnt+).print(); /调用后缀的+,当前对象的value已经 /加1,报
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 11 运算 重载 ppt 课件
链接地址:https://www.31doc.com/p-2565677.html