第9章友元与运算符重载_第1页
第9章友元与运算符重载_第2页
第9章友元与运算符重载_第3页
第9章友元与运算符重载_第4页
第9章友元与运算符重载_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY学好程序设计的学好程序设计的根本方法根本方法是是 程序!程序!写写计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY 第第9章章 友元函数与运算符重载友元函数与运算符重载9.1 友元函数与友元类友元函数与友元类9.2 运算符重载运算符重载9.3 一元运算符重载一元运算符重载9.4 二元运算符重载二元运算符重载 习题习题 实验实验 课堂练习课堂练习计算机科学与工程学院计算机科学与工程学院JIANGSU U

2、NIVERSITY of SCIENCE & TECHNOLOGY9.1 9.1 友元函数与友元类友元函数与友元类 为了强调数据的安全性,程序设计中通常将一些关键成为了强调数据的安全性,程序设计中通常将一些关键成员设为私有访问特性,只允许类的成员函数直接访问,其员设为私有访问特性,只允许类的成员函数直接访问,其他函数必须间接访问。同时,他函数必须间接访问。同时,C+通过友元方案,向用户提通过友元方案,向用户提供了从类的外部直接访问类中所有访问权限成员的接口,供了从类的外部直接访问类中所有访问权限成员的接口,包括:包括:(1) 友元函数友元函数把外部函数说明为本类的友元,则在该外把外部函

3、数说明为本类的友元,则在该外部函数中可以直接访问本类的所有访问权限成员;部函数中可以直接访问本类的所有访问权限成员;(2) 友元成员函数友元成员函数把其他类的成员函数说明为本类的友把其他类的成员函数说明为本类的友元,则该成员函数是本类的友元函数;元,则该成员函数是本类的友元函数;(3) 友元类友元类把其他类说明为本类的友元,则该类的所有把其他类说明为本类的友元,则该类的所有成员函数都是本类的友元函数。成员函数都是本类的友元函数。计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY1. 友元函数概念友元函数概念 类中

4、用关键字类中用关键字friend说明或定义的说明或定义的外部外部函数,成员的访问权限函数,成员的访问权限对其不起作用,即可以访问类中所有访问权限的成员。对其不起作用,即可以访问类中所有访问权限的成员。2. 友元函数定义友元函数定义(1) 类中说明,类外定义类中说明,类外定义 类中原型说明:类中原型说明: friend 类型类型 函数名(形参列表);函数名(形参列表); 类外定义:类外定义: 类型类型 函数名(形参列表)函数名(形参列表) 函数体函数体 (2) 类中直接定义类中直接定义 friend 类型类型 函数名(形参列表)函数名(形参列表) 函数体函数体 9.1.1 9.1.1 友元函数友

5、元函数计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY【例【例9-1】求圆柱体的体积求圆柱体的体积(友元、成员与普通函数比较友元、成员与普通函数比较)#includeconst float PI=3.1415 ;class A float r,h;public: A(float a,float b)r=a;h=b; float v1( ) return PI*r*r*h; float getr()return r; float geth()return h;float v2(A t) return PI*t.g

6、etr()*t.getr()*t.geth();float v3(A &t) return PI*t.r*t.r*t.h;9.1.1 9.1.1 友元函数友元函数 void main() A a1(25,40); couta1.v1( )n; coutv2(a1)n; coutv3(a1)r)*(p-r)*(p-h); coutv4(a1)n; 计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY 使用友元函数时注意:使用友元函数时注意:(1) 类的访问控制权限只对类的成员起作用,对友元函数不起作类的访问控

7、制权限只对类的成员起作用,对友元函数不起作用,因此友元函数的声明可以出现在类中的任何位置。用,因此友元函数的声明可以出现在类中的任何位置。(2) 友元函数没有友元函数没有this指针,不能直接使用类的成员,必须指明指针,不能直接使用类的成员,必须指明成员所属的对象。所以友元函数的形参通常是类的对象、对成员所属的对象。所以友元函数的形参通常是类的对象、对象的引用、指针。象的引用、指针。(3) 友元函数是外部函数,不能通过对象调用,应该直接调用。友元函数是外部函数,不能通过对象调用,应该直接调用。(4) 友元函数能提高程序的运行效率,但破坏了类的封装性,应友元函数能提高程序的运行效率,但破坏了类的

8、封装性,应谨慎使用。谨慎使用。(5) 友元关系不具有继承性。假设函数友元关系不具有继承性。假设函数f是基类是基类A的友元函数,类的友元函数,类B是类是类A的派生类,而函数的派生类,而函数f并不是类并不是类B的友元函数,即函数的友元函数,即函数f中不能直接访问类中不能直接访问类C的私有成员。的私有成员。9.1.1 9.1.1 友元函数友元函数 计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY C+允许将一个类说明为另一个类的友元类。如将类允许将一个类说明为另一个类的友元类。如将类C说明为说明为类类B的友元类,则类

9、的友元类,则类C的成员函数将全部成为类的成员函数将全部成为类B的友元函数。的友元函数。【例【例9-2】设计一个类作为另一个类的友元类。设计一个类作为另一个类的友元类。class C;class B public: void sub(C &),show(C);class C int a,b;public: C(int x,int y)a=x; b=y; friend class B; /将类将类B说明为类说明为类C的友元类的友元类 ;void B:sub(C &t) t.a-; t.b-; void B:show(C t) coutt.att.bn;void main() B b

10、1; C c1(30,40); b1.show(c1); b1.sub(c1); b1.show(c1); 9.1.2 9.1.2 友元类友元类 思考:思考:类类C的成员函数能的成员函数能否访问类否访问类B的私有的私有成员?成员?计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY1. 运算符重载概念运算符重载概念 通常情况下,通常情况下, C+运算符的操作数为基本类型的数据,不能运算符的操作数为基本类型的数据,不能进行对象的运算。若要使对象参与运算,必须重新定义运算符进行对象的运算。若要使对象参与运算,必须重新定

11、义运算符的运算规则,称为运算符重载。运算符重载实质是定义运算符的运算规则,称为运算符重载。运算符重载实质是定义运算符重载函数,即通过对象成员的运算实现对象的运算。为了方便重载函数,即通过对象成员的运算实现对象的运算。为了方便对成员的操作,该函数通常是类的对成员的操作,该函数通常是类的成员函数成员函数或者是或者是友元函数友元函数。2. 运算符重载方法运算符重载方法 定义运算符重载函数,函数名由关键字定义运算符重载函数,函数名由关键字operator与其后的与其后的运算运算符符组成。组成。 (1) 用类的成员函数重载用类的成员函数重载 函数类型函数类型 operator 运算符运算符 (形参列表形

12、参列表) 函数体函数体 (2) 用类的友元函数重载用类的友元函数重载 friend 函数类型函数类型 operator运算符运算符 (形参列表形参列表) 函数体函数体 9.2 9.2 运算符重载概述运算符重载概述计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY【例【例9-3】重载重载负号运算符负号运算符-,求复数的负值。,求复数的负值。#include class Com float real,image;public: Com(float r=0,float i=0) real=r; image=i; voi

13、d print() coutrealtimage”。 (3) 只能用只能用友元函数友元函数重载的运算符重载的运算符插入运算符插入运算符“”。(4) 运算符重载不能改变运算符的优先级、操作数的个数和结合运算符重载不能改变运算符的优先级、操作数的个数和结合性等基本性质;运算符重载是重新定义运算符的运算规则,性等基本性质;运算符重载是重新定义运算符的运算规则,拓宽运算符操作数的范围,不能创建新的运算符。拓宽运算符操作数的范围,不能创建新的运算符。计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY用成员函数重载一元运算符

14、时,可以通过用成员函数重载一元运算符时,可以通过this指针传递需操指针传递需操作的对象,函数通常没有参数。但自增和自减运算符,有前置作的对象,函数通常没有参数。但自增和自减运算符,有前置与后置之分,与后置之分,后置后置时增加一个时增加一个int型形参,区别于前置。型形参,区别于前置。1. 自增与自减运算符重载自增与自减运算符重载 (1) 前置:前置: 函数类型函数类型 operator+(); 函数类型函数类型 operator-(); (2) 后置:后置: 函数类型函数类型 operator+(int); 函数类型函数类型 operator-(int); 由于自增和自减运算的结果仍为一个对

15、象,可以进一步参与由于自增和自减运算的结果仍为一个对象,可以进一步参与表达式运算,所以函数类型通常为该类型对象或对象的引用。表达式运算,所以函数类型通常为该类型对象或对象的引用。 9.3 9.3 一元运算符重载一元运算符重载计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY【例【例9-4】用成员函数重载自增运算符用成员函数重载自增运算符#include class A int m,n;public: A(int x=0,int y=0) m=x; n=y; A operator+( ) / 前置前置+ +m; +

16、n; return *this; A operator+(int); / 后置后置+ void print( ) coutm=mtn=nn; ; A A:operator+(int) A t=*this; +m; +n; / +(*this); return t;9.3.1 9.3.1 用成员函数重载一元运算符用成员函数重载一元运算符 void main( ) A a1(1,2),a2(10,20),a3,a4; a3=+a1; a4=a2+; a1.print( ); a3.print( ); a2.print( ); a4.print( ); 用成员函数重载自减用成员函数重载自减运算符的方

17、法与重载自运算符的方法与重载自增运算符相似,只需把增运算符相似,只需把程序中的程序中的+改为改为-即可。即可。计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY 友元函数是外部函数,没有友元函数是外部函数,没有this指针,重载一元运算符时,必指针,重载一元运算符时,必须通过函数的参数传递操作的对象,即运算符重载函数有一个须通过函数的参数传递操作的对象,即运算符重载函数有一个对象或对象引用类型的参数。对于自增和自减运算符,与成员对象或对象引用类型的参数。对于自增和自减运算符,与成员函数重载相似,函数重载相似,后置

18、后置时增加一个时增加一个int型形参,区别于前置。型形参,区别于前置。1. 自增与自减运算符重载自增与自减运算符重载 (1) 前置:前置: friend 函数类型函数类型 operator+(数据类型数据类型 对象名对象名); friend 函数类型函数类型 operator-(数据类型数据类型 对象名对象名); (2) 后置:后置: friend 函数类型函数类型 operator+(数据类型数据类型 对象名对象名,int); friend 函数类型函数类型 operator-(数据类型数据类型 对象名对象名,int); 其中的函数类型与数据类型通常为所定义的类;当数据成员其中的函数类型与数

19、据类型通常为所定义的类;当数据成员使用了动态内存,或需参数带回操作结果时,必须为引用。使用了动态内存,或需参数带回操作结果时,必须为引用。 9.3.2 9.3.2 用友元函数重载一元运算符用友元函数重载一元运算符 计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY【例【例9-5】用友元函数重载用友元函数重载-#include class A int m,n;public: A(int x=0,int y=0) m=x; n=y; friend A operator-(A &t) / 前置前置- t.m-;

20、 t.n-; return t; friend A operator-(A &t,int); / 后置后置- void print( ) coutm=mtn=nn; ; A operator-(A &t,int) A temp=t; t.m-; t.n-; / -t; return temp;9.3.2 9.3.2 用友元函数重载一元运算符用友元函数重载一元运算符 void main( ) A a1(1,2),a2(10,20),a3,a4; a3=-a1; a4=a2-; a1.print( ); a3.print( ); a2.print( ); a4.print( );

21、用友元函数重载自增运算用友元函数重载自增运算符的方法与重载自减运算符符的方法与重载自减运算符相似,只需把程序中的相似,只需把程序中的-改改为为+即可。即可。计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGYl 用成员函数重载一元运算符时,因为用成员函数重载一元运算符时,因为this指针的存在,重载函指针的存在,重载函数的参数个数通常为数的参数个数通常为0;重载后置自增和自减运算符时,增加一;重载后置自增和自减运算符时,增加一个无名称的整型参数,区别于前置;个无名称的整型参数,区别于前置; this指针指向运算符操

22、作的指针指向运算符操作的对象,即指向调用运算符重载函数的对象。如类对象,即指向调用运算符重载函数的对象。如类A中定义了:中定义了: A operator!(); A opreator-(); A operator-(int);l 用友元函数重载一元运算符时,重载函数的参数个数通常为用友元函数重载一元运算符时,重载函数的参数个数通常为1;形参一般为对象或对象的引用,被操作的对象作为实参传递给形参一般为对象或对象的引用,被操作的对象作为实参传递给重载函数的形参。如类重载函数的形参。如类A中定义了:中定义了: friend A operator!(A &t); friend A opreat

23、or+(A &t); friend A operator+(A&t,int);9.3.2 9.3.2 用友元函数重载一元运算符用友元函数重载一元运算符 !a1 a1.operator!(); -a1 a1.operator-();a1- a1.operator-(int); !a1operator!(a1); +a1operator+(a1);a1+a1.operator+(a1,int); 计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY 类型转换是指把对象(实质是对象的数据成员)转换成其他类

24、型转换是指把对象(实质是对象的数据成员)转换成其他类型的数据。可通过成员函数重载类型转换运算符,实现对象类型的数据。可通过成员函数重载类型转换运算符,实现对象的转换,其定义格式如下:的转换,其定义格式如下: oparator 数据类型数据类型(); 函数名由关键字函数名由关键字operator与要转换的与要转换的数据类型数据类型组成;转换函数组成;转换函数虽然没有函数类型,却是有值型函数,函数体中必须用虽然没有函数类型,却是有值型函数,函数体中必须用return 语句返回一个表达式,且表达式的数据类型必须与函数名中的语句返回一个表达式,且表达式的数据类型必须与函数名中的数据类型相同。数据类型相

25、同。 转换函数转换函数没有参数没有参数,不能被重载。定义转换函数后,就可以,不能被重载。定义转换函数后,就可以像基本数据一样对对象进行类型转换。像基本数据一样对对象进行类型转换。 9.3.3 9.3.3 类型转换运算符重载类型转换运算符重载计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY【例【例9-6】转换函数转换函数class A int a;public: A(int x=0) a=x; void print( ) couta=0 ;i-) si=t%10+0; t=t/10; return s;9.3.1

26、 9.3.1 用成员函数重载一元运算符用成员函数重载一元运算符void main( ) A a1(12345); a1.print(); char *str; str=a1; /A coutstr=strn; couta1endl; /B delete str; A行和行和B行均调用转换函行均调用转换函数,把对象数,把对象a1转换为一个转换为一个字符串字符串(字符型指针字符型指针)。,语法错误语法错误operator char*( );计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY用成员函数重载二元运算符时,

27、可以通过用成员函数重载二元运算符时,可以通过this指针传递一个操指针传递一个操作的对象,通过函数参数传递另一个操作的对象。作的对象,通过函数参数传递另一个操作的对象。 对于对象表达式对于对象表达式“对象对象1 运算符运算符 对象对象2” ,this指针指向对象指针指向对象1 , 对象对象2 为参数,运算符重载函数的基本形式为:为参数,运算符重载函数的基本形式为: 函数类型函数类型 operator 运算符运算符(数据类型数据类型 对象对象); 其中的函数类型与数据类型通常为所定义的类;当数据成员其中的函数类型与数据类型通常为所定义的类;当数据成员使用了动态内存,或需参数带回操作结果时,必须为

28、引用。使用了动态内存,或需参数带回操作结果时,必须为引用。 C+系统预先重载了赋值运算符,所以同类型对象之间可以系统预先重载了赋值运算符,所以同类型对象之间可以直接赋值。预先重载的赋值运算符仅实现对象之间的浅赋值,直接赋值。预先重载的赋值运算符仅实现对象之间的浅赋值,即对象对应数据成员之间的简单赋值。与拷贝构造函数建立对即对象对应数据成员之间的简单赋值。与拷贝构造函数建立对象相似,在使用动态内存时,用于赋值的不同对象的指针成员象相似,在使用动态内存时,用于赋值的不同对象的指针成员指向同一个内存空间,会引起内存引用错误,必须重载赋值运指向同一个内存空间,会引起内存引用错误,必须重载赋值运算符。这

29、也是函数类型与参数必须为引用的原因。算符。这也是函数类型与参数必须为引用的原因。9.4 9.4 二元运算符重载二元运算符重载计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY【例【例9-7】用成员函数重载用成员函数重载=#include #include class STR char *s;public: STR(char *p=0) if(p) s=new charstrlen(p)+1; strcpy(s,p); else s=0; STR& operator=(STR &t) if(t.s)

30、 if(s) delete s; s=new charstrlen(t.s)+1; strcpy(s,t.s); else s=0; return *this; void print( ) if(s) cout“s=sn; STR()if(s)delete s; 9.4.1 9.4.1 用成员函数重载二元运算符用成员函数重载二元运算符 void main( ) STR t1(“abced”),t2; t2=t1; t1.print( ); t2.print( ); 计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOG

31、Y【例【例9-8】用成员函数重载加法运算符用成员函数重载加法运算符#include class A int a,b;public: A(int x=0,int y=0) a=x; b=y; A operator+(int n) A temp=*this;temp.a+=n; return temp; A operator+(A t); void print( ) coutatbn; ;9.4.1 9.4.1 用成员函数重载二元运算符用成员函数重载二元运算符A A:operator+(A t) A temp=*this; temp.a+=t.a; temp.b+=t.b; return temp

32、;void main( ) A a1(1,2),a2(4,5),a3,a4; a3= ; a4= ; a1.print( ); a2.print( ); a3.print( ); a4.print( );a1+a2a2+100a1.operator(a2)a2.operator(100)计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY 友元函数重载二元运算符时,必须通过函数的二个参数友元函数重载二元运算符时,必须通过函数的二个参数传递操作的对象,且其中必定有一个对象或对象引用类型的传递操作的对象,且其中必定有一

33、个对象或对象引用类型的参数。其基本格式为:参数。其基本格式为:friend 函数类型函数类型 operator 运算符运算符(数据类型数据类型 变量变量,数据类型数据类型 变变量量);l若二元运算的结果为对象,则函数类型应为所定义的类;若二元运算的结果为对象,则函数类型应为所定义的类;l参数的数据类型中至少有一个为所定义的类;参数的数据类型中至少有一个为所定义的类;l当数据成员使用了动态内存,或需参数对象带回操作结果时,当数据成员使用了动态内存,或需参数对象带回操作结果时,必须为引用;必须为引用;l对象表达式调用运算符重载函数时,表达式中数据顺序与函对象表达式调用运算符重载函数时,表达式中数据

34、顺序与函数参数的顺序一致。数参数的顺序一致。 9.4.2 9.4.2 用友元函数重载二元运算符用友元函数重载二元运算符 计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY【例【例9-9】用友元函数重载用友元函数重载+#include class A int a,b;public: A(int x=0,int y=0) a=x; b=y; friend A operator+(A &t,int n) A temp=t;temp.a+=n; return temp; friend A operator+(A&

35、amp;,A&); void print( ) coutatbn; ;9.4.2 9.4.2 用友元函数重载二元运算符用友元函数重载二元运算符 A operator+(A &t1,A &t2) A temp=t1; temp.a+=t2.a; temp.b+=t2.b; return temp;void main( ) A a1(1,2),a2(4,5),a3,a4; a3= ; a4= ; a1.print( ); a2.print( ); a3.print( ); a4.print( );a1+a2a2+100operator(a1,a2)operator(a2,1

36、00)主函数中能否添加语句主函数中能否添加语句“a4=100+a2;”?计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY【例【例9-10】用友元函数重载提取和插入运算符用友元函数重载提取和插入运算符#includeclass A int a,b;9.4.2 9.4.2 用友元函数重载二元运算符用友元函数重载二元运算符 void main() A a1;cina1;cout(istream &,A &);friend ostream & operator(istream &in,A

37、 &t) int.at.b; return in; ostream & operator(ostream &out,A &t) outt.att.bendl; return out; 计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGYl 用成员函数重载二元运算符时,通过用成员函数重载二元运算符时,通过this指针和函数参数(个指针和函数参数(个数为数为1)分别传递二个对象;)分别传递二个对象;this指针指向对象表达式中的第指针指向对象表达式中的第1个个对象,表达式中的第对象,表达

38、式中的第2个对象为参数。如:个对象为参数。如: A opreator+=(A); 则则a1+=a2; a1.operator+=(a2);l 用友元函数重载二元运算符时,通过二个参数传递对象。如:用友元函数重载二元运算符时,通过二个参数传递对象。如: friend A opreator+=(A &,A); 则则a1+=a2; operator+=(a1,a2);l 重载同一个运算符,友元函数重载通常比成员函数重载多一个重载同一个运算符,友元函数重载通常比成员函数重载多一个对象或对象引用类型的参数;对象表达式相同,但含义不同。对象或对象引用类型的参数;对象表达式相同,但含义不同。 成员成

39、员函数重载函数重载 友元友元函数重载函数重载 一元一元运算符运算符 无参无参 一个对象或引用参数一个对象或引用参数 二元二元运算符运算符 一个对象或引用参数一个对象或引用参数 二个对象或引用参数二个对象或引用参数 一元一元后置后置 一个整型参数一个整型参数 一个对象和整型参数一个对象和整型参数9.4.2 9.4.2 用友元函数重载二元运算符用友元函数重载二元运算符 计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY1. 定义一个复数类定义一个复数类,重载重载+、*、+=、!=运算符运算符,实现两个复数之间实现两个

40、复数之间的加法、乘法、复合的赋值运算和判断两个复数是否相等的的加法、乘法、复合的赋值运算和判断两个复数是否相等的运算。运算。2. 定义一个字符数组类定义一个字符数组类String,通过成员函数重载,通过成员函数重载“+=”运算符,运算符,通过友元函数重载通过友元函数重载“-=”运算符,实现两个字符串的拼接和删运算符,实现两个字符串的拼接和删除运算。具体要求如下:除运算。具体要求如下:(1) 定义构造函数,初始化私有数据成员(字符类型指针变定义构造函数,初始化私有数据成员(字符类型指针变量);量);(2) 定义定义void operator+=(String &t),实现字符串的拼接;,

41、实现字符串的拼接;(3)定义定义friend void operator-=(String &t1, String &t2),从母,从母串中删除子串,即从串中删除子串,即从t1的数据成员中删除的数据成员中删除t2的数据成员;的数据成员;(3)定义定义void print( ),输出数据成员;,输出数据成员;(4)定义析构函数,释放动态内存定义析构函数,释放动态内存(3) 对所定义的类进行测试。对所定义的类进行测试。习题习题计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY3. 定义一维数组类定义一

42、维数组类Array,成员数组使用动态内存。重载自增和,成员数组使用动态内存。重载自增和自减运算符实现数组元素值的自增和自减。具体要求如下:自减运算符实现数组元素值的自增和自减。具体要求如下:(1) 私有数据成员私有数据成员int *p,n; 分别存放一维数组中的元素及元素分别存放一维数组中的元素及元素个数个数(2) 定义构造函数初始化数据成员,定义析构函数释放动态内定义构造函数初始化数据成员,定义析构函数释放动态内存;存;(3)用成员函数重载自增运算符(前置和后置用成员函数重载自增运算符(前置和后置 ););(4)用友元函数重载自减运算符(前置和后置);用友元函数重载自减运算符(前置和后置);

43、 (5) 定义定义void print( ),输出数据成员;,输出数据成员;(6)用数据用数据1,2,3,4,5,6,7对对Array类进行测试,要求类进行测试,要求输出数组元素的自增和自减(前置、后置)情况。输出数组元素的自增和自减(前置、后置)情况。习题习题计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY4. 重载运算符重载运算符“”实现数组各对应元素相乘方。例如实现数组各对应元素相乘方。例如:a3=2,2,2,b3=3,3,3,则则ab=8,8,8。具体要求如下:。具体要求如下:(1) 私有数据成员私有数

44、据成员int a3; 存放一维数组存放一维数组(2) 公有成员函数公有成员函数构造函数,初始化数据成员;构造函数,初始化数据成员;友元函数重载运算符友元函数重载运算符“”;void print():输出数组成员的函数;:输出数组成员的函数;(3) 在主函数中定义对象在主函数中定义对象t1(以数组以数组a作参数作参数)、t2(以数组以数组b作参作参数数)和和t3(无参无参),通过语句通过语句“t3=t1t2;”对类进行测试。对类进行测试。习题习题计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY5. 定义一个数组类

45、定义一个数组类Array,实现二维数组的旋转。通过重载正号实现二维数组的旋转。通过重载正号运算符运算符“+”,顺时针旋转顺时针旋转90o,通过重载负号运算符通过重载负号运算符“-”,逆时针旋逆时针旋转转90o。具体要求如下:。具体要求如下:(1) 私有数据成员私有数据成员int b44;/数据成员,存放数组数据成员,存放数组(2) 公有成员函数公有成员函数Array(int p44):构造函数,初始化数据成员;:构造函数,初始化数据成员;void operator +( ):重载函数,使数组顺时针旋转:重载函数,使数组顺时针旋转90o;friend void operator -(Array

46、&b):重载函数,使数组逆时针:重载函数,使数组逆时针旋转旋转90o;void print():输出数据成员。:输出数据成员。(3) 对所定义的类进行测试。要求输出原始数组和旋转之后的对所定义的类进行测试。要求输出原始数组和旋转之后的数组。数组。习题习题计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY【实验目的】【实验目的】1.掌握友元函数定义方法,理解友元函数的特性;掌握友元函数定义方法,理解友元函数的特性;2.掌握用成员函数重载运算符的方法;掌握用成员函数重载运算符的方法;3.掌握用友元函数重载运算

47、符的方法。掌握用友元函数重载运算符的方法。【实验内容】【实验内容】1. 定义一个复数类定义一个复数类Complex,用成员函数重载,用成员函数重载“+”运算符,用友元函数重载运算符,用友元函数重载和和“-”运算符,完成两个复数的加法和减法运算。运算符,完成两个复数的加法和减法运算。 (1)私有数据成员:私有数据成员:float real,image; 数据成员,存放复数的实部和虚部;数据成员,存放复数的实部和虚部; (2)公有成员函数:公有成员函数:Complex (float r=0,float i=0); 构造函数,以形参初始化数据成员;构造函数,以形参初始化数据成员;Complex op

48、erator+(Complex); 重载函数,完成复数的加法运算;重载函数,完成复数的加法运算;void print(); 输出数据成员;输出数据成员; (3)友元函数友元函数friend Complex operator-(Complex, Complex); 完成复数的减法运算;完成复数的减法运算; (4)对所定义的类进行测试。对所定义的类进行测试。 实验实验计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY【实验内容】【实验内容】2. 定义一个字符串类定义一个字符串类STR,实现字符串中字符的循环移动。通过

49、成员函数重,实现字符串中字符的循环移动。通过成员函数重载位运算符载位运算符“”,使字符串右移,使字符串右移n位。具体要位。具体要求如下:求如下:(1)私有数据成员:私有数据成员:char *s; 数据成员,存放字符串数据成员,存放字符串 (2)公有成员函数:公有成员函数:STR(char *p); 构造函数,以形参初始化数据成员;构造函数,以形参初始化数据成员;void operator(STR &str, int n);使字符串右移使字符串右移n位;位; (4)对所定义的类进行测试。在主函数中输入一个带空格的字符串作为测对所定义的类进行测试。在主函数中输入一个带空格的字符串作为测试数

50、据,先使它左移试数据,先使它左移2位,再使它右移位,再使它右移4位。位。 实验实验计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY【实验指导】【实验指导】1. 两个复数的加法运算,是实部和虚部分别相加,因此定复数类的数据成员两个复数的加法运算,是实部和虚部分别相加,因此定复数类的数据成员有两个:有两个:real和和image分别保存复数的实部和虚部。分别保存复数的实部和虚部。“+”运算符是个二元运运算符是个二元运算符,用成员函数重载时,函数有一个形参,是复数类的对象,另一个对算符,用成员函数重载时,函数有一个形

51、参,是复数类的对象,另一个对象是当系统自动调用重载函数时,调用成员函数的。在函数体内,用调用象是当系统自动调用重载函数时,调用成员函数的。在函数体内,用调用成员函数的对象的实部和虚部分别和形参对象的实虚部相加,完成复数的成员函数的对象的实部和虚部分别和形参对象的实虚部相加,完成复数的加法运算,最后,函数返回保存运算结果的对象值。用友元函数重载二元加法运算,最后,函数返回保存运算结果的对象值。用友元函数重载二元运算符,函数的形参个数比用成员函数重载多一个,因为友元函数的调用运算符,函数的形参个数比用成员函数重载多一个,因为友元函数的调用形式类同与普通函数。形式类同与普通函数。2. 左移和右移运算

52、符都是二元运算符,因此可以把移动的位数作为重载函数左移和右移运算符都是二元运算符,因此可以把移动的位数作为重载函数的形参。私有数据成员是指针变量,只能保存一个地址,因此要用的形参。私有数据成员是指针变量,只能保存一个地址,因此要用new运运算符动态申请空间,来保存要移位的字符串。朝左移位时,首先把当前位算符动态申请空间,来保存要移位的字符串。朝左移位时,首先把当前位置的字符保存下来,然后把其后的字符依次朝左移动,覆盖掉前一个字符,置的字符保存下来,然后把其后的字符依次朝左移动,覆盖掉前一个字符,最后把保存下来的字符赋值给本次移位的最后一个字符。最后把保存下来的字符赋值给本次移位的最后一个字符。

53、 实验实验计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY1. 以下关于类的友元函数的描述中,不正确的是(以下关于类的友元函数的描述中,不正确的是( ) 。A. 一个类的友元函数要用一个类的友元函数要用“friend”说明说明B. 友元函数在类体中说明时,不受类中访问权限的限制友元函数在类体中说明时,不受类中访问权限的限制C. 友元函数的作用域与类中成员函数的作用域相同友元函数的作用域与类中成员函数的作用域相同D. 友元函数体的定义通常放在类体之外友元函数体的定义通常放在类体之外 2. 下面对于友元函数描述正确

54、的是(下面对于友元函数描述正确的是( ) 。A. 友元函数的实现必须在类的内部定义友元函数的实现必须在类的内部定义B. 友元函数是类的成员函数友元函数是类的成员函数C. 友元函数破坏了类的封装性和隐藏性友元函数破坏了类的封装性和隐藏性D. 友元函数不能访问类的私有成员友元函数不能访问类的私有成员 3. 类类A是类是类B的友元,类的友元,类B是类是类C的友元,则正确说法是(的友元,则正确说法是( ) 。A. 类类B是类是类A的友元的友元 B. 类类C是类是类A的友元的友元C. 类类A是类是类C的友元的友元 D. 以上都不对以上都不对 课堂练习课堂练习 CC D计算机科学与工程学院计算机科学与工程

55、学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY4. 一个类的友元函数能够访问该类的(一个类的友元函数能够访问该类的( ) 。A. 私有成员私有成员 B. 保护成员保护成员C. 公有成员公有成员 D. 所有成员所有成员 5. 下面关于类的成员函数与友元函数的叙述正确的是(下面关于类的成员函数与友元函数的叙述正确的是( ) 。A. 一个类的成员函数可以成为另一个类的友元函数一个类的成员函数可以成为另一个类的友元函数B. 在访问对象时都使用成员运算符在访问对象时都使用成员运算符“.” C. 定义时都不用使用作用域运算符定义时都不用使用作用域运算符“:

56、” D. 都必须定义在类外都必须定义在类外 6. 下面对于友元函数描述正确的是(下面对于友元函数描述正确的是( )。)。A. 友元函数破坏了类的封装性和隐藏性友元函数破坏了类的封装性和隐藏性 B. 友元函数不是类的成员函数,不能访问类的私有成员友元函数不是类的成员函数,不能访问类的私有成员C. 友元函数的参数不能是非对象类型的友元函数的参数不能是非对象类型的D. 为了不受访问权限的限制,必须在类的公有部分说明友元函为了不受访问权限的限制,必须在类的公有部分说明友元函数数 一、选择题一、选择题 D A A计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIE

57、NCE & TECHNOLOGY7. 如果类如果类A是类是类B的友元,则的友元,则 ( )。)。A. 类类A的成员即类的成员即类B的成员的成员 B. 类类B的成员即类的成员即类A的成员的成员C. 类类B不一定是类不一定是类A的友元的友元 D. 类类B的成员函数可以访问类的成员函数可以访问类A的所有成员的所有成员 8. 若在表达式若在表达式y/x 中,中,“/”是作为成员函数重载的运算符,则表达式还是作为成员函数重载的运算符,则表达式还可以表示为(可以表示为( ) 。A. x.operator/(y) B. operator/(x,y)C. y.operator/(x) D. opera

58、tor/(y,x) 9. 若重载若重载Com类的前置自增,应在类体中将其申明为(类的前置自增,应在类体中将其申明为( ) 。A. Com &operator+(); B. Com &operator+(int); C. friend Com& operator+(); D. friend Com& operator+(int); 10. 以下关于运算符重载的叙述中,正确的是(以下关于运算符重载的叙述中,正确的是( ) 。A. 已有的任何运算符都可以重载已有的任何运算符都可以重载B. 可以重载可以重载C+中没有的运算符中没有的运算符C. 运算符重载时可改变其优先级

59、运算符重载时可改变其优先级 D. 运算符重载时可改变其实现的运算符重载时可改变其实现的功能功能 一、选择题一、选择题 CC A D计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY11. 用友元函数进行双目运算符重载时,该友元函数的参数表中应定义用友元函数进行双目运算符重载时,该友元函数的参数表中应定义 个参数(个参数( )。)。A. 0 B. 1 C. 2 D.3 12. 如下运算符重载函数定义错误的原因是(如下运算符重载函数定义错误的原因是( ) 。 double operator+(int i, int k

60、)return double(i+k); A. “+”只能作为成员函数重载,这里的只能作为成员函数重载,这里的“+”是作为非成员函数重载的是作为非成员函数重载的B. 两个两个int型参数的和也应是型参数的和也应是int型,这里将函数的返回类型声明为型,这里将函数的返回类型声明为doubleC. 没有将运算符重载函数声明为某个类的友元没有将运算符重载函数声明为某个类的友元D. C+已经提供了求两个已经提供了求两个int型数据之和的运算符型数据之和的运算符“+”,不能再定义同,不能再定义同样的运算符样的运算符 13. 下列运算符中全都可以被友元函数重载的是下列运算符中全都可以被友元函数重载的是 ( )。)。A. =,+,-, B. ,+,(),new C.-,+,*, D.,+,* 14. 只能用成员函数重载的是(只能用成员函数重载的是( ) 。A. = B.+ C.* D. new 一、选择题一、选择题C D D A计算机科学与工程学院计算机科学与工程学院JIANGSU UNIVERSITY of SCIENCE & TECHNOLOGY15. 下面关于运算符重载函数的叙述正确的是(下面关于运算符重载函数的叙述正确的是( ) 。A. 成员函数和友元函数可重载的运算符是不相同的成员函数和友元函数可重

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论