书签 分享 收藏 举报 版权申诉 / 85
上传文档赚钱

类型C-第11章运算符重载课件.ppt

  • 上传人(卖家):三亚风情
  • 文档编号:3470825
  • 上传时间:2022-09-03
  • 格式:PPT
  • 页数:85
  • 大小:413KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《C-第11章运算符重载课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    11 运算 重载 课件
    资源描述:

    1、C+大学教程 2007.9v简介简介v用普通函数重载用普通函数重载v用友员函数重载用友员函数重载v用成员函数重载用成员函数重载v典型的运算符重载典型的运算符重载v输入输出重载输入输出重载v实例研究:实例研究:array类类v实例研究:实例研究:string类类C+大学教程 2007.9v使得系统的内置运算符适用于类的对象使得系统的内置运算符适用于类的对象之间的操作。提高程序的可读性。之间的操作。提高程序的可读性。C+大学教程 2007.9v希望某些运算符能够对整个对象进行操作,希望某些运算符能够对整个对象进行操作,而不是而不是C C中的简单操作中的简单操作.v例如:例如:+运算符能够实现运算符

    2、能够实现2 2个对象间的加。个对象间的加。v类类A A的对象的对象a1a1、a2a2、a3a3,希望:,希望:a3=a1+a2a3=a1+a2;即:分别把对象即:分别把对象a1a1和和a2a2的各个数据成员值对应的各个数据成员值对应相加,然后赋给对象相加,然后赋给对象a3a3。C+大学教程 2007.9v把某些事交给系统去做,用户只要知道相加把某些事交给系统去做,用户只要知道相加就可就可v提出运算符重载,扩充运算符的功能。即:提出运算符重载,扩充运算符的功能。即:对运算符进行重载定义,然后使用,由系统对运算符进行重载定义,然后使用,由系统自动判断究竟采用哪一个具体的运算符。自动判断究竟采用哪一

    3、个具体的运算符。v增强了增强了C+C+语言的可扩充性。语言的可扩充性。C+大学教程 2007.9v不是所有的运算符都能重载不是所有的运算符都能重载v重载不能改变运算符的优先级和结合性重载不能改变运算符的优先级和结合性v重载不能改变运算符的操作数个数重载不能改变运算符的操作数个数v不能创建新的运算符不能创建新的运算符v不能改变用于内部类型对象时的含义不能改变用于内部类型对象时的含义v用于用户自定义类型对象,或者和内部类型用于用户自定义类型对象,或者和内部类型的对象混合使用的对象混合使用C+大学教程 2007.9 +-*/%&|!=+=-=*=/=%=&=|=!=&|+-*,-()new dele

    4、te new delete .*:?:sizeof 不能重载的运算符:C+大学教程 2007.9v用普通函数实现用普通函数实现v用成员函数实现用成员函数实现v用友元函数实现用友元函数实现C+大学教程 2007.9v简介简介v用普通函数重载用普通函数重载v用友员函数重载用友员函数重载v用成员函数重载用成员函数重载v典型的运算符重载典型的运算符重载v输入输出重载输入输出重载v实例研究:实例研究:array类类v实例研究:实例研究:string类类C+大学教程 2007.9v创建运算符函数创建运算符函数v运算符函数名为:运算符函数名为:operator后接一个要重载的运算符后接一个要重载的运算符。如

    5、:要重载如:要重载“+”运算,函数名为运算,函数名为 operator+。重载重载“-”运算,函数名为运算,函数名为 operator-。v参数表为要参加运算的对象,返回值为运算参数表为要参加运算的对象,返回值为运算结果结果C+大学教程 2007.9#include class complexpublic:int r,i;complex(int rr=0,int ii=0)i=ii;r=rr;complex operator+(complex a1,complex a2)complex t;t.r=a1.r+a2.r;t.I=a1.i+a2.i;return t;void main()comp

    6、lex a1(1,2),a2(3,4),b;b=a1+a2;cout b.r b.i;C+大学教程 2007.9v运算符重载通常要对类的私有数据成员运算符重载通常要对类的私有数据成员作操作。如果用普通函数重载,则需要作操作。如果用普通函数重载,则需要通过公有的方法访问私有的数据成员,通过公有的方法访问私有的数据成员,运算速度较慢,或将所有的数据成员都运算速度较慢,或将所有的数据成员都设为公有,直接访问这些数据成员,这设为公有,直接访问这些数据成员,这样将违反类的封装。样将违反类的封装。C+大学教程 2007.9v简介简介v用普通函数重载用普通函数重载v用友员函数重载用友员函数重载v用成员函数重

    7、载用成员函数重载v典型的运算符重载典型的运算符重载v输入输出重载输入输出重载v实例研究:实例研究:array类类v实例研究:实例研究:string类类C+大学教程 2007.9v把运算符函数定义成把运算符函数定义成某个类的友元函数某个类的友元函数,称为友元运算符函数。称为友元运算符函数。v友元函数在类内部的声明友元函数在类内部的声明 friend type operator(参数表参数表);v友元函数的定义:与一般函数相同友元函数的定义:与一般函数相同 type operator(参数表参数表)/函数体函数体C+大学教程 2007.9v友元运算符函数必须有两个参数友元运算符函数必须有两个参数v

    8、例:二元加操作符重载为友元函数例:二元加操作符重载为友元函数#includeclass A int x,y;public:A(int xx,int yy):x(xx),y(yy)A()x=0;y=0;friend A operator+(const A&a,const A&b);void show()coutx=x y=yendl;A operator+(const A&a,const A&b)return A(a.x+b.x,a.y+b.y);void main()A a1(5,55),a2(6,66),a3;a3=a1+a2;/调用操作符重载函数调用操作符重载函数:oprator+(a1,

    9、a2)a3.show();x=11 y=121C+大学教程 2007.9v友元运算符有一个参数友元运算符有一个参数v例:一元减操作符重载为友元函数例:一元减操作符重载为友元函数#includeclass A int x,y;public:A(int xx,int yy):x(xx),y(yy)A()x=0;y=0;friend A operator-(const A&a);void show()coutx=x y=yendl;A operator-(const A&a)return A(-a.x,-a.y);void main()A a1(5,55);a1=-a1;/调用操作符重载函数调用操作

    10、符重载函数:operator+(a1)a1.show();x=-5 y=-55C+大学教程 2007.9v简介简介v用普通函数重载用普通函数重载v用友员函数重载用友员函数重载v用成员函数重载用成员函数重载v典型的运算符重载典型的运算符重载v输入输出重载输入输出重载v实例研究:实例研究:array类类v实例研究:实例研究:string类类C+大学教程 2007.9v运算符重载通常作用在一个类上,因此可定运算符重载通常作用在一个类上,因此可定义为义为类的成员函数或友元函数类的成员函数或友元函数。v成员运算符函数的声明成员运算符函数的声明 class X/type operator(参数表)参数表)

    11、/v成员运算符函数的定义成员运算符函数的定义 type X:operator(参数表)参数表)/函数体函数体 C+大学教程 2007.9v成员运算符只需要一个参数,作为运算符的右操作数,成员运算符只需要一个参数,作为运算符的右操作数,当前对象作为左操作数。当前对象作为左操作数。v例例1 1:二元加操作符重载为成员函数。:二元加操作符重载为成员函数。#include class A int x,y;public:A(int xx,int yy):x(xx),y(yy)A()x=0;y=0;A operator+(A b)A tmp;tmp.x=x+b.x;tmp.y=y+b.y;return t

    12、mp;void show()coutx=x y=yendl;void main()A a1(5,55),a2(6,66),a3;a3=a1+a2;/a3=a1.operator+(a2);a3.show();x=11 y=121C+大学教程 2007.9v成员运算符无参数成员运算符无参数v例:一元减操作符重载为成员函数例:一元减操作符重载为成员函数#includeclass A int x,y;public:A(int xx,int yy):x(xx),y(yy)A()x=0;y=0;A operator-()return A(-x,-y);void show()coutx=x“y=y-这这4

    13、 4种操作符必须重载成成员函种操作符必须重载成成员函数外,其他操作符重载成友元函数较好。数外,其他操作符重载成友元函数较好。例,例,a a是类是类A A的一个对象,对于表达式:的一个对象,对于表达式:27.5+a27.5+a对友元函数不存在问题:对友元函数不存在问题:operator+(A(27.5),a)operator+(A(27.5),a)但是,对成员函数存在问题:但是,对成员函数存在问题:(27.5).operator+(a)(27.5).operator+(a)/非法:非法:27.527.5不是一个对象,无不是一个对象,无thisthis指针。指针。C+大学教程 2007.9v成员运

    14、算符函数和友元运算符函数都可用成员运算符函数和友元运算符函数都可用习惯方式调用,也可用专用方式调用。习惯方式调用,也可用专用方式调用。习惯方式习惯方式友元运算符调友元运算符调用方式用方式成员运算符调成员运算符调用方式用方式a+boperator+(a,b)a.operator+(b)-aoperator-(a)a.operator-()C+大学教程 2007.9v简介简介v用普通函数重载用普通函数重载v用友员函数重载用友员函数重载v用成员函数重载用成员函数重载v典型的运算符重载典型的运算符重载v输入输出重载输入输出重载v实例研究:实例研究:array类类v实例研究:实例研究:string类类C

    15、+大学教程 2007.9v+和和-的重载的重载v=的重载的重载v类型转换类型转换C+大学教程 2007.9v、-:是一元操作符:是一元操作符v但是,可以是前缀或后缀。所以,重载但是,可以是前缀或后缀。所以,重载时有所不同。时有所不同。v区分方法:区分方法:前缀:一元操作符。前缀:一元操作符。后缀:二元操作符。后缀:二元操作符。C+大学教程 2007.9v成员函数重载成员函数重载 +ob重载为:重载为:ob.operator+()ob-重载为:重载为:ob.operator-(int)v友元函数重载友元函数重载 +ob重载为:重载为:operator+(X&ob)ob-重载为:重载为:opera

    16、tor-(X&ob,int)v调用时,参数调用时,参数int一般传递给值一般传递给值0。C+大学教程 2007.9#includeclass Counter unsigned value;public:Counter(int v=0)value=v;Counter operator+()value+;cout1.value ;return*this;Counter operator+(int)Counter t;cout2.value ;t.value=value+;return t;void display()coutvalueendl;void main()Counter a(11),b(

    17、22),c;+a;/自动调用自动调用 operator+()a.display();c=b+;/自动调用自动调用operator+(int)b.display();c.display();1.12 122.22 2322 */C+大学教程 2007.9#includeclass Counter unsigned value;public:Counter(int v=0)value=v;friend Counter operator+(Counter&);friend Counter operator+(Counter&,int);void display()const coutvalueend

    18、l;Counter operator+(Counter&cc)cc.value+;cout1.cc.value ;return cc;Counter operator+(Counter&cc,int)Counter t;cout2.cc.value=0)if(s1i 9|s1i 0)cout set error;i=-1;else sj=s1i;-i;+j;for(;j 128;+j)sj=0;longlong()for(int i=0;i128;+i)si=0;C+大学教程 2007.9longlong operator+(const longlong&p1,const longlong&p

    19、2)longlong t;int i,j=0;for(i=0;i 10)j=t.si/10;else j=0;t.si=t.si%10+0;return t;C+大学教程 2007.9longlong operator+(const longlong&p1,const int&p2)longlong t;int i,j=0;for(i=0;i 10)j=t.si/10;else j=0;t.si=t.si%10+0;return t;C+大学教程 2007.9void show()int i=127;while(si=0)-i;/去掉高位去掉高位0 while(i=0)coutsi;-i;co

    20、utendl;C+大学教程 2007.9void main()longlong a(123),b(345),c;c=a+b;c.show();c=a+5;c.show();648128C+大学教程 2007.9v+和和-的重载的重载v=的重载的重载v类型转换类型转换C+大学教程 2007.9v对任一类,如果用户没有自定义赋值运算符函数,对任一类,如果用户没有自定义赋值运算符函数,那么系统为其生成一个缺省的赋值运算符函数,那么系统为其生成一个缺省的赋值运算符函数,在对应成员间赋值。在对应成员间赋值。X&X:operator=(const X&source)/成员间对应赋值成员间对应赋值 一旦创建

    21、了对象一旦创建了对象x1,x2,可以用可以用 x1=x2赋值。赋值。C+大学教程 2007.9v有时,使用缺省运算符函数会产生错误。如:有时,使用缺省运算符函数会产生错误。如:#include#include Class string char*ptr;public:string(char*s)ptr=new charstrlen(s)+1;strcpy(ptr,s);string()delete ptr;void print()coutptrendl;void main()string p1(“chen”);string p2(“);p2=p1;cout “p2:”;p2.print();c

    22、out “p1:”;p1.print();/*p1指向的空间会丢失指向的空间会丢失*/C+大学教程 2007.9v显式定义一个赋值运算符重载函数,使显式定义一个赋值运算符重载函数,使p1和和p2有各自的存储空间,实现方法如下:有各自的存储空间,实现方法如下:string&string:operator=(const string&s)if(this=&s)return*this;delete ptr;ptr=new charstrlen(s.ptr)+1;strcpy(ptr,s.ptr);return*this;C+大学教程 2007.9#include#include class stri

    23、ngchar*ptr;public:string(char*s)ptr=new charstrlen(s)+1;strcpy(ptr,s);string()delete ptr;void print()coutptrendl;string&operator=(const string&);string&string:operator=(const string&s)if(this=&s)return*this;delete ptr;ptr=new charstrlen(s.ptr)+1;strcpy(ptr,s.ptr);return*this;void main()string p1(che

    24、n);string p2();p2=p1;coutp2:;p2.print();cout=0)if(s1i 9|s1i 0)cout set error;i=-1;else sj=s1i;-i;+j;for(;j 128;+j)sj=0;在程序中可用:在程序中可用:a=“1234567890123”;C+大学教程 2007.9v在上面的赋值运算符重载函数中,函数在上面的赋值运算符重载函数中,函数的参数是的参数是char*,这样会使得,这样会使得c=a+b这这样的运算不能执行,因为表达式的右边样的运算不能执行,因为表达式的右边是一个对象而不是字符串。是一个对象而不是字符串。v解决方法:可以用函数

    25、重载再写一个赋解决方法:可以用函数重载再写一个赋值函数,他的参数是对象值函数,他的参数是对象C+大学教程 2007.9v+和和-的重载的重载v=的重载的重载v类型转换类型转换C+大学教程 2007.9v隐式类型转换隐式类型转换 赋值时赋值时 运算时运算时v显式类型转换显式类型转换 强制转换法:强制转换法:(类型名)表达式类型名)表达式 函数法:类型名(表达式)函数法:类型名(表达式)C+大学教程 2007.9v通过构造函数进行类型转换通过构造函数进行类型转换#include class example int num;public:example(int n)num=n;void print(

    26、)coutnumendl;void main()example x=6;/通过构造函数进行类型转换通过构造函数进行类型转换 x.print();C+大学教程 2007.9v通过类型转换函数进行类型转换通过类型转换函数进行类型转换 声明格式:声明格式:operator 类型标识符类型标识符()const;定义格式:定义格式:类名类名:operator 类型标识符类型标识符()const ;return 类型标识符指定的变量;类型标识符指定的变量;v 说明:说明:类类型转换函数:无函数返回类型,无参数。因为,类类型转换函数:无函数返回类型,无参数。因为,总是转换成总是转换成“类型标识符类型标识符”

    27、所指出的类型,且被转所指出的类型,且被转换的总是本类的一个对象(由换的总是本类的一个对象(由this指针指出)。指针指出)。类型转换函数只能定义为非静态的成员函数类型转换函数只能定义为非静态的成员函数C+大学教程 2007.9class Counter int v1;char v2;public:Counter(int v=0,char vv=?)v1=v;v2=vv;operator char()return v2;operator int()return v1;void display()coutCounter:v1=v1 v2=v2endl;friend Counter fn(Count

    28、er c);Counter fn(Counter c)c.v1=c.v1*2;return c;void main()char x;int y;Counter c1(64,%),c2(99,);c1.display();c2.display();c2=fn(12345);/实参实参12345通过构造函数通过构造函数 /Counter(int v=0,char vv=?)转换成转换成Counter类型类型 c2.display();x=c1;/通过成员函数转换成通过成员函数转换成char型型 y=c1;/通过成员函数转换成通过成员函数转换成int型型 coutx yendl;Counter:v1

    29、=64 v2=%Counter:v1=99 v2=Counter:v1=24690 v2=?%64 C+大学教程 2007.9v运算符重载与类型转换:在某些情况下,运算符重载与类型转换:在某些情况下,用户希望将类对象与基本数据类型进行用户希望将类对象与基本数据类型进行运算,这可以通过运算符重载来完成。运算,这可以通过运算符重载来完成。如要实现复数与整型数相加:如要实现复数与整型数相加:C+大学教程 2007.9v运算符重载与类型转换:在某些情况下,运算符重载与类型转换:在某些情况下,用户希望将类对象与基本数据类型进行用户希望将类对象与基本数据类型进行运算,这可以通过运算符重载来完成。运算,这可

    30、以通过运算符重载来完成。如要实现复数与整型数相加:如要实现复数与整型数相加:C+大学教程 2007.9class complex float real,imag;public:complex(float r=0,float i=0)real=r;imag=i;friend complex operator+(int x,complex y)complex tmp;tmp.real=x+y.real;tmp.imag=y.imag;return tmp;void print()coutreal,imagendl;void main()complex ob1(10.5,20.5),ob2;int

    31、x=100;ob1.print();ob2=x+ob1;/整型变量与类对象相加整型变量与类对象相加 ob2.print();/*输出输出 10.5,20.5 110.5,20.5*/C+大学教程 2007.9v简介简介v用普通函数重载用普通函数重载v用友员函数重载用友员函数重载v用成员函数重载用成员函数重载v典型的运算符重载典型的运算符重载v输入输出重载输入输出重载v实例研究:实例研究:array类类v实例研究:实例研究:string类类C+大学教程 2007.9v能否使类的对象也能像内置类型一样直能否使类的对象也能像内置类型一样直接用接用cin和和cout完成输入输出?完成输入输出?v方法是

    32、重载流插入方法是重载流插入v的重载是使用友元函数的重载是使用友元函数C+大学教程 2007.9v定义格式:定义格式:ostream&operator(ostream&stream,const class_name&obj)/操作代码操作代码 return stream;C+大学教程 2007.9v原有的实现方法原有的实现方法#include class Aint x,y;public:A(int xx,int yy):x(xx),y(yy)void show()cout x=“x y=“y endl;void main()A a1(5,55);a1.show();/*执行结果执行结果:x=5

    33、y=55*/C+大学教程 2007.9v现在的实现方法现在的实现方法class Aint x,y;public:A(int xx,int yy):x(xx),y(yy)friend ostream&operator(ostream&op,const A&a);ostream&operator(ostream&op,const A&a)op x=“a.x y=“a.y endl;return op;void main()A a1(5,55);cout a1;/*执行结果执行结果:x=5 y=55*/C+大学教程 2007.9ostream&operator=0)ss p.si;-i;ss end

    34、l;return ss;如定义了如定义了longlong类的对象类的对象a,在使用中可用,在使用中可用 cout(istream&stream,class_name&obj)/操作代码操作代码 return stream;C+大学教程 2007.9v简介简介v用普通函数重载用普通函数重载v用友员函数重载用友员函数重载v用成员函数重载用成员函数重载v典型的运算符重载典型的运算符重载v输入输出重载输入输出重载v实例研究:实例研究:array类类v实例研究:实例研究:string类类C+大学教程 2007.9v数组无越界检查数组无越界检查v不能一次输入或输出整个数组不能一次输入或输出整个数组v不能比

    35、较两个数组不能比较两个数组v数组作为参数传递时必须有一个额外的数组作为参数传递时必须有一个额外的参数表示数组的大小参数表示数组的大小v数组不能直接赋值数组不能直接赋值C+大学教程 2007.9v设计一个整型数组的改进版设计一个整型数组的改进版保证数组不越界保证数组不越界允许将一个数组赋给另一个数组允许将一个数组赋给另一个数组数组对象自动知道数组的大小数组对象自动知道数组的大小可以用可以用=和!和!=直接比较两个数组直接比较两个数组C+大学教程 2007.9v将某一函数的执行表示成数组中的下标将某一函数的执行表示成数组中的下标形式。形式。v下标运算符重载时,只能显式声明一个下标运算符重载时,只能

    36、显式声明一个参数,即下标值。其格式为参数,即下标值。其格式为 数组类型数组类型&operator(int i)v只能重载为成员函数只能重载为成员函数C+大学教程 2007.9class Array friend ostream&operator(istream&,Array&);int size;/size of the array int*ptr;/pointer to first element of array static int arrayCount;/#of Arrays instantiated public:Array(int=10);/default constructor

    37、Array(const Array&);/copy constructor Array();/destructorArray类的定义类的定义C+大学教程 2007.9 int getSize()const;/return size const Array&operator=(const Array&);/assign arrays bool operator=(const Array&)const;/compare equal /Determine if two arrays are not equal and /return true,otherwise return false(uses

    38、operator=).bool operator!=(const Array&right)const return!(*this=right);int&operator(int);/subscript operator const int&operator(int)const;/subscript operator static int getArrayCount()/Return count of return arrayCount;/arrays instantiated.;C+大学教程 2007.9/Initialize static data member at file scopei

    39、nt Array:arrayCount=0;/no objects yet/Default constructor for class Array(default size 10)Array:Array(int arraySize)size=(arraySize 0?arraySize:10);ptr=new int size ;/create space for arrayassert(ptr!=0);/terminate if memory not allocated+arrayCount;/count one more object for(int i=0;i size;i+)ptr i

    40、 =0;/initialize arrayC+大学教程 2007.9/Copy constructor for class Array/must receive a reference to prevent infinite recursionArray:Array(const Array&init):size(init.size)ptr=new int size ;/create space for array assert(ptr!=0);/terminate if memory not allocated +arrayCount;/count one more object for(in

    41、t i=0;i size;i+)ptr i =init.ptr i;/copy init into object C+大学教程 2007.91 每个类只有一个析构函数和一个赋值函数,每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包括一个拷贝构造但可以有多个构造函数(包括一个拷贝构造函数,其它的称为普通构造函数)。函数,其它的称为普通构造函数)。2 对于任意一个类对于任意一个类A,如果不想编写上述函数,如果不想编写上述函数,C+编译器将自动为编译器将自动为A产生四个缺省的函数:产生四个缺省的函数:对象复制可以将一个对象的所有数据成员的值赋给同类的另一个对象,如果对象的数据成员中不存

    42、在指针,则没有问题,但如果其中含有指针,则这种方式只是简单地把指针所指向的内容的地址复制过来,并没有复制其所指的内容。这可能并不是用户所期望的。这要通过自定义的复制策略来实现:拷贝构造函数和重载运算符“=”。C+大学教程 2007.9在C+中,下面三种对象需要拷贝构造函数 1 一个对象以值传递的方式传入函数体一个对象以值传递的方式传入函数体 2 一个对象以值传递的方式从函数返回一个对象以值传递的方式从函数返回 3 一个对象需要通过另外一个对象进行初始化一个对象需要通过另外一个对象进行初始化 拷贝构造函数的形式拷贝构造函数的形式A(const A&)C+大学教程 2007.9 拷贝构造函数是在对

    43、象创建时调用的,而赋拷贝构造函数是在对象创建时调用的,而赋值函数只能被已经存在了的对象调用。值函数只能被已经存在了的对象调用。string a(Hello);string b(world);string c=a/调用了拷贝构造函数调用了拷贝构造函数,最好写成最好写成c(a)c=b/调用了赋值函数调用了赋值函数C+大学教程 2007.9 /Destructor for class Array Array:Array()delete ptr;/reclaim space for array -arrayCount;/one fewer objects /Get the size of the ar

    44、ray int Array:getSize()const return size;C+大学教程 2007.9/const return avoids:(al=a2)=a3const Array&Array:operator=(const Array&right)if(&right!=this)if(size!=right.size)delete ptr;/reclaim space size=right.size;/resize this object ptr=new int size;assert(ptr!=0);/terminate if not allocated for(int i=0

    45、;i size;i+)ptr i =right.ptr i;return*this;/enables x=y=z;C+大学教程 2007.9bool Array:oprator=(const Array&right)const if(size!=right.size)return false;/arrays of different sizes for(int i=0;i size;i+)if(ptr i !=right.ptr i )return false;/arrays are not equal return true;/arrays are equal C+大学教程 2007.9检查

    46、下标是否越界检查下标是否越界int&Array:operator (int subscript)assert(0=subscript&subscript size);return ptr subscript;/reference return const int&Array:operator (int subscript)const assert(0=subscript&subscript(istream&input,Array&a)for(int i=0;i a.ptr i;return input;/enables cin x y;C+大学教程 2007.9ostream&operator

    47、(ostream&output,const Array&a)int i;for(i=0;i a.size;i+)output setw(12)a.ptr i;if(i+1)%4=0)/4 numbers per row of output output endl;if(i%4!=0)output endl;return output;/enables cout y;C+大学教程 2007.9int main()/no objects yet cout#of arrays instantiated=Array:getArrayCount()n;/create two arrays and pri

    48、nt Array count Array integers1(7),integers2;cout#of arrays instantiated=Array:getArrayCount()nn;#of arrays instantiated=0#of arrays instantiated 2C+大学教程 2007.9/print integersl size and contents cout Size of array integers1 is integers1.getSize()nArray after initialization:n integersl n;/print intege

    49、rs2 size and contents cout Size of array integers2 is integers2.getSize()nArray after initialization:n integers2 n;Size of array integersl is 7Array after initialization:0 0 0 0 0 0 0 0 Size of array integers2 is 10Array after initialization:0 0 0 0 0 0 0 0 0 0C+大学教程 2007.9/input and print integersl

    50、 and integers2 cout integers1 integers2;cout After input,the arrays contain:n integersl:n infegers1 integers2:n integers2 n;/use overloaded inequality(!=)operator cout Evaluating:integers1!=integers2n;if(integers1!=integers2)cout They are not equaln;Input 17 integers:1 2 3 4 5 6 7 8 9 10 11 12 13 14

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:C-第11章运算符重载课件.ppt
    链接地址:https://www.163wenku.com/p-3470825.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库