当前位置:文档之家› 习题7及其解答

习题7及其解答

习题7及其解答7.1 选择题1.在下列运算符中,不能重载的是( b )。

(a) ! (b) sizeof (c) new (d) delete2.下列关于运算符重载的描述中,( d )是正确的。

(a) 可以改变参与运算的操作数个数(b) 可以改变运算符原来的优先级(c) 可以改变运算符原来的结合性(d) 不能改变原运算符的语义3.下列函数中,不能重载运算符的函数是( b )。

(a) 成员函数(b) 构造函数(c) 普通函数 (d) 友员函数4.要求用成员函数重载的运算符是( a )。

(a) = (b) == (c) <= (d) ++5.要求用友员函数重载的运算符是( c )。

(a) = (b) [] (c) << (d) ()6.下面关于类型转换的描述中,错误的是( a )。

(a) 任何形式的构造函数都可以实现数据类型转换。

(b) 带非默认参数的构造函数可以把基本类型数据转换成类类型对象。

(c) 类型转换函数可以把类类型对象转换为其他指定类型对象。

(d) 类型转换函数只能定义为一个类的成员函数,不能定义为类的友员函数。

7.2 阅读下列程序,写出执行结果1.#include <iostream>using namespace std;class T{ public :T() { a = 0; b = 0; c = 0; }T( int i, int j, int k ){ a = i; b =j; c = k; }void get( int &i, int &j, int &k ){ i = a; j = b; k = c; }T operator* ( T obj );private:int a , b , c;};T T::operator* ( T obj ){ T tempobj;tempobj.a = a * obj.a;tempobj.b = b * obj.b;tempobj.c = c * obj.c;return tempobj;}int main(){ T obj1( 1,2,3 ), obj2( 5,5,5 ), obj3;int a , b , c;obj3 = obj1 * obj2;obj3.get( a, b, c );cout<<"( obj1*obj2 ): "<<"a = "<<a<<'\t'<<"b = "<<b<<'\t'<<"c = "<<c<<'\t'<<endl;(obj2*obj3).get( a, b, c );cout<<"( obj2*obj3 ): "<<"a = "<<a<<'\t'<<"b = "<<b<<'\t'<<"c = "<<c<<'\t'<<endl;}【解答】( obj1 * obj2 ): a = 5 b = 10 c = 15( obj2 * obj3 ): a = 25 b = 50 c = 752.#include <iostream>using namespace std;class Vector{ public:Vector(){ }Vector(int i,int j){ x = i ; y = j ;}friend Vector operator+ ( Vector v1, Vector v2 ){ Vector tempVector ;tempVector.x = v1.x + v2.x ;tempVector.y = v1.y + v2.y ;return tempVector ;}void display(){ cout << "( " << x << ", " << y << ") "<< endl ; }private:int x , y ;};int main(){ Vector v1( 1, 2 ), v2( 3, 4 ), v3 ;cout << "v1 = " ;v1.display() ;cout << "v2 = " ;v2.display() ;v3 = v1 + v2 ;cout << "v3 = v1 + v2 = " ;v3.display() ;}【解答】v1 = ( 1, 2 )v2 = ( 3, 4 )v3 = v1 + v2 = ( 4, 6 )7.3 思考题1.一个运算符重载函数被定义为成员函数或友员函数,从定义方式、解释方式和调用方式上有何区别?可能会出现什么问题?请用一个实例说明之。

【解答】以二元运算符为例。

可能会出现的问题:(1)运算符的左右操作数不同,须用友员函数重载;(2)当运算符的操作需要修改类对象状态时,应用成员函数重载。

(3)友员函数不能重载运算符 = () [] ->必须要用友员函数重载的运算符 >> <<程序略。

2.类类型对象之间,类类型和基本类型对象之间用什么函数进行类型转换?归纳进行类型转换的构造函数和类型转换函数的定义形式、调用形式和调用时机。

【解答】构造函数可以把基本类型、类类型数据转换成类类型数据;类类型转换函数可以在类类型和基本数据类型之间做数据转换。

7.4 编程题1.分别使用成员函数和友员函数编写程序重载运算符“+”,使该运算符能实现两个字符串的连接。

【解答】(1)使用成员函数#include <iostream>#include<cstring>using namespace std;class s{ public:s(){ *str = '\0'; }s( char *pstr ){ strcpy( str,pstr );}char *gets(){ return str;}s operator+( s obj );private:char str[10];};s s::operator+( s obj ){ strcat( str,obj.str );return str; //或return *this}int main(){ s obj1( "Visual" ),obj2( " C++" ),obj3;obj3 = obj1 + obj2;cout << obj3.gets() << endl;}(2)使用友员函数#include <iostream>#include<cstring>using namespace std;class s{ public:s(){ *str= '\0'; }s( char *pstr ){ strcpy( str,pstr );}char *gets(){ return str;}friend s operator+( s obj1,s obj2 );private:char str[100];};s operator+( s obj1,s obj2 ){ s tempobj;strcat( tempobj.str,obj1.str );strcat( tempobj.str,obj2.str );return tempobj;}int main(){ s obj1( "Visual" ),obj2( " C++" ),obj3;obj3 = obj1 + obj2;cout << obj3.gets() << endl;}2.定义一个整数计算类Integer,实现短整数 +,-,*,/ 基本算术运算。

要求可以进行数据范围检查(-32768~32767,或自行设定),数据溢出时显示错误信息并中断程序运行。

【解答】#include <iostream>using namespace std;class Integer{ private:short a;public:Integer (short n=0){ a=n;}Integer operator +(Integer);Integer operator -(Integer);Integer operator *(Integer);Integer operator /(Integer);Integer operator =(Integer);void display(){ cout<<a<<endl; }};Integer Integer::operator+(Integer x){ Integer temp;if(a+x.a<-32768||a+x.a>32767){ cout<<"Data overflow!"<<endl; abort(); }temp.a=a+x.a;return temp;}Integer Integer::operator-(Integer x){ Integer temp;if(a-x.a<-32768||a-x.a>32767){ cout<<"Data overflow!"<<endl; abort(); }temp.a=a-x.a;return temp;}Integer Integer::operator*(Integer x){ Integer temp;if(a*x.a<-32768||a*x.a>32767) {cout<<"Data overflow!"<<endl; abort();}temp.a=a*x.a;return temp;}Integer Integer::operator/(Integer x){ Integer temp;if(a/x.a<-32768||a/x.a>32767){ cout<<"Data overflow!"<<endl; abort(); }temp.a=a/x.a;return temp;}Integer Integer::operator=(Integer x){ a=x.a;return *this;}int main(){ Integer A(90),B(30),C;cout<<"A=";A.display();cout<<"B=";B.display();C=A+B;cout<<"C=A+B="; C.display();C=A-B;cout<<"C=A-B="; C.display();C=A*B;cout<<"C=A*B="; C.display();C=A/B;cout<<"C=A/B="; C.display();}3.定义一个实数计算类Real,实现单精度浮点数 +,-,*,/ 基本算术运算。

相关主题