习题7及其解答

2018-12-02 14:45

习题7及其解答

7.1 选择题

1.在下列运算符中,不能重载的是( b )。 (a) !

(b) sizeof

(c) new

(d) delete

2.下列关于运算符重载的描述中,( d )是正确的。 (a) 可以改变参与运算的操作数个数 (c) 可以改变运算符原来的结合性 (a) 成员函数 (b) 构造函数 (a) = (a) =

(b) == (b) []

(b) 可以改变运算符原来的优先级 (d) 不能改变原运算符的语义 (c) 普通函数 (d) 友员函数 (c) <= (c) <<

(d) ++ (d) ()

3.下列函数中,不能重载运算符的函数是( b )。 4.要求用成员函数重载的运算符是( a )。 5.要求用友员函数重载的运算符是( c )。 6. 下面关于类型转换的描述中,错误的是( a )。 (a) 任何形式的构造函数都可以实现数据类型转换。

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

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

7.2 阅读下列程序,写出执行结果

1.

#include 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<<\

<<\ (obj2*obj3).get( a, b, c ); cout<<\

<<\} 【解答】

( obj1 * obj2 ): a = 5 b = 10 c = 15 ( obj2 * obj3 ): a = 25 b = 50 c = 75

2.

#include 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 << \ private: int x , y ; };

int main()

{ Vector v1( 1, 2 ), v2( 3, 4 ), v3 ; cout << \ v1.display() ; cout << \ v2.display() ; v3 = v1 + v2 ;

cout << \ v3.display() ; } 【解答】 v1 = ( 1, 2 )

v2 = ( 3, 4 )

v3 = v1 + v2 = ( 4, 6 )

7.3 思考题

1. 一个运算符重载函数被定义为成员函数或友员函数,从定义方式、解释方式和调用方式上有何区【解答】

以二元运算符为例。

运算符重载 成员函数 定义 Obj& operator op(); Obj operator op(object); 解释 Obj.operator op() ObjL.operator op(ObjR) 调用 Obj op 或 op Obj ObjL op ObjR 左操作数通过this指针指定,右操作数由参数传递 友员函数 friend Obj & operator op(Obj &); operator op(Obj) friend Obj operator op(Obj,Obj); operator op(ObjL,ObjR) Obj op 或 op Obj ObjL op ObjR 操作数均由参数传递 别?可能会出现什么问题?请用一个实例说明之。

可能会出现的问题:

(1)运算符的左右操作数不同,须用友员函数重载;

(2)当运算符的操作需要修改类对象状态时,应用成员函数重载。 (3)友员函数不能重载运算符 = () [] -> 必须要用友员函数重载的运算符 >> << 程序略。

2. 类类型对象之间,类类型和基本类型对象之间用什么函数进行类型转换?归纳进行类型转换的构【解答】

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

构造函数 类类型转换函数 定义形式 ClassX::ClassX(arg,arg1=E1,...,argn=En); ClassX::operator Type(); 调用形式 隐式调用 用类型符显式调用; 自动类型转换时隐式调用 调用时机 建立对象、参数传递时 需要做数据类型转换时 造函数和类型转换函数的定义形式、调用形式和调用时机。

7.4 编程题

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

(1) 使用成员函数 #include #include 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( \ obj3 = obj1 + obj2;

cout << obj3.gets() << endl; }

(2)使用友员函数 #include #include 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( \ obj3 = obj1 + obj2;

cout << obj3.gets() << endl; }

2.定义一个整数计算类Integer,实现短整数 +,-,*,/ 基本算术运算。要求可以进行数据范围检查(-32768~32767,或自行设定),数据溢出时显示错误信息并中断程序运行。

【解答】

#include 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<

Integer Integer::operator+(Integer x) { Integer temp;

if(a+x.a<-32768||a+x.a>32767)

{ cout<<\ temp.a=a+x.a; return temp; }

Integer Integer::operator-(Integer x) { Integer temp;

if(a-x.a<-32768||a-x.a>32767)

{ cout<<\temp.a=a-x.a; return temp; }

Integer Integer::operator*(Integer x) { Integer temp;

if(a*x.a<-32768||a*x.a>32767) {cout<<\temp.a=a*x.a; return temp; }

Integer Integer::operator/(Integer x) { Integer temp;

if(a/x.a<-32768||a/x.a>32767)

{ cout<<\ temp.a=a/x.a;


习题7及其解答.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:谈谈对国防教育的认识

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: