当前位置:文档之家› 作业━━第 5 章(4)━━运算符重载.

作业━━第 5 章(4)━━运算符重载.

运算符重载【学习要点】1.理解多态性的概念和实现。

①编译时多态性是通过函数重载、运算符重载实现的。

②运行时多态性是通过类的继承+虚函数实现的。

2.掌握运算符重载的作用和规则。

①在C++中可根据需要对运算符赋予多种含义,以配合用户自定义的类类型。

②运算符重载是通过定义运算符重载函数 operator运算符(实现的。

3.掌握双目、单目运算符重载为成员函数的方法。

4.掌握双目、单目运算符重载为友元函数的方法。

5.掌握重载为成员函数、重载为友元函数的区别:①友元函数与成员函数不同,它不是类的成员,没有this指针。

②运算符 =、()、[ ]、—> 不能重载为友元函数,只能重载为成员函数。

③运算符插入”<<”、提取”>>” 只能重载为友元函数。

6.掌握几个特殊运算符“++”、“--”、“=”、“[ ]”、“<<”、“>>”的重载。

7.掌握类型转换函数。

8.掌握自定义字符串类。

9.掌握C++标准库中的string类的使用。

------------------------------------------------------------------------------------------------------------------------------------------------【例题分析】1.下面程序中的错误有几处?#includeclass C{ int x , y ;public:C ( { }C ( int a , int b : x( a , y( b { }C operator@ ( C a{ C temp ; temp.x=x+a.x ; temp.y=y+a.y ; return temp ; }int operator# ( C a{ return ( x * y ; }friend C operator= ( C a{ x=a.x ; y=b.y ; return *this ; }void show({ cout << "x=" << x <<"\ty=" << y << endl ; }};void main({ C a( 2 , 3 , b( 2 , 3 , c ;(a+b.show( ; c=a ; c.show( ;}【答案】3【解析】①函数C operator@ (C a ; 运算符重载是允许用户重新定义运算符的含义,但此运算符必须是C++系统预定义的,而“@”不是C++预定义的运算符,应换成“+”。

②函数int operator# (C a ; 符号#不允许重载,应换成“*”,另外形参C a也不需要。

③函数friend C operator = (C a ; 赋值运算符“=”只能重载为成员函数,不能重载为友元函数,故将friend删去。

其次,返回类型最好是 C & 。

2.编写程序:存放在my Vector.cpp文件中,包含内容如下:①定义向量类Vector。

私有成员数据有:存放向量在三条坐标轴上投影值的x、y、z。

公有成员函数有:可设置向量中x、y、z值的成员函数void set( float a=0, float b=0, float c=0 ;可输出向量中x、y、z值的成员函数void show( ;构造函数Vector ( float a=0 , float b=0 , float c=0 ;构造函数Vector( float v[ 3 ] ;两个赋值运算符“=”重载成员函数Vector & operator=( Vector v 、Vector & operator=( float v[ 3 ] 。

②将实现两个向量之间加、减、乘运算的三个独立函数声明为Vector类的友元函数:friend Vector operator+( Vector v1 , Vector v2 ;friend Vector operator-( Vector v1 , Vector v2 ;friend float operator*( Vector v1 , Vector v2 ;③编写main(函数去测试,完成向量间的运算。

【提示】若向量a在三条坐标轴上的投影为a x , a y , a z,则表达式a = { a x , a y , a z } 称为向量a的坐标表达式。

设有两个向量a和b,它们之间的加、减、乘的运算公式为:a +b = { ax +bx , ay +by , az+bz }a -b = { ax -bx , ay -by , az-bz }a *b = ax *bx + ay *by + az *bz将运算符“+”、“-”、“*”和“=”重载,实现向量间的加、减、乘、赋值运算。

【答案】编写程序如下:#include#includeclass Vector{ float x , y , z;public:Vector( float a=0 , float b=0 , float c=0{ x=a ; y=b ; z=c ; }Vector( float v[ 3 ]{ x=v[0] ; y=v[1] ; z=v[2] ; }void set( float a=0 , float b=0 , float c=0{ x=a ; y=b ; z=c ; }void show({ cout << x << 'i' ;cout << ( (y<0 ? '-' : '+' << fabs(y << 'j' ;cout << ( (z<0 ? '-' : '+' << fabs(z << 'k' << endl ; }Vector & operator=( Vector v ;Vector & operator=( float v[ 3 ] ;friend Vector operator+( Vector v1 , Vector v2 ;friend Vector operator-( Vector v1 , Vector v2 ;friend float operator*( Vector v1 , Vector v2 ;};Vector & Vector:: operator=( Vector v{ x=v.x ; y=v.y ; z=v.z ; return *this ; }Vector & Vector:: operator=( float v[ 3 ]{ x=v[0] ; y=v[1] ; z=v[2] ; return *this ; }Vector operator+( Vector v1 , Vector v2{ Vector temp ;temp.x=v1.x+v2.x ; temp.y=v1.y+v2.y ; temp.z=v1.z+v2.z ; return temp ; }Vector operator-( Vector v1 , Vector v2{ Vector temp ;temp.x=v1.x-v2.x ; temp.y=v1.y-v2.y ; temp.z=v1.z-v2.z ;return temp ; }float operator*( Vector v1 , Vector v2{ return ( v1.x*v2.x + v1.y*v2.y + v1.z*v2.z ; }void main({ float a[ ] = { 1 , 2 , 3 } ;Vector v1( a , v2( 4 , 5 , 6 , v3( 7 , 8 , 9 , v4 , v5 ;v4 = v1 + v2 ; v4.show( ;v5 = v3 - v1 ; v5.show( ;cout << "v1*v2=" << v1*v2 << endl ;}【解析】定义向量类,并对各运算符进行重载。

本程序采用友元函数重载“+”、“-”、“*”运算符,在此也可采用成员函数重载,从程序可读性考虑,一般认为双目运算符,重载为友元函数更好些。

但重载“=”运算符必须用成员函数。

------------------------------------------------------------------------------------------------------------------------------------------------【思考题】㈠选择题1.下面运算符中,不能重载的是______。

A.?:B.+spanC.*D.<=【答案】???【提示】C++中不能被重载的运算符有“::”、“?:”、“.”、“.*”、“sizeof”2.下面运算符中,不能重载的是______。

A.&&B.[ ]C.::D.new【答案】???3.关于运算符重载,下面描述中正确的是______。

A.运算符重载可以改变操作数的个数B.运算符重载可以改变优先级C.运算符重载可以改变结合性D.运算符重载不可以改变语法结构【答案】???【提示】运算符重载不能改变操作数的个数、运算符的优先级、运算符的结合性和运算的语法结构。

4.友元重载运算符obl>ob2 被C++编译器解释为______。

A.operator>( obl , ob2B.>( ob1 , ob2C.ob2.operator>( ob1D.ob1.operator>( ob2【答案】???【提示】友元函数重载运算符的调用形式:operator<运算符>( <参数1>,<参数2>等价于表达式:<参数1> <运算符> <参数2>5.若a+b运算需通过成员函数实现“+”运算符重载,下面描述中正确的是______。

A.a必须为该类对象,b可为其它数据类型B.a和b都必须为该类对象C.b必须为该类对象,a可为其它数据类型D.a和b均可为其它数据类型【答案】???【提示】成员函数实现a+b时,编译器解释为:a.operator(b,因此左操作数a必须为该类对象,否则无法实现成员函数的调用,而右操作数可以是该类的对象,也可以是其它数据类型。

相关主题