习题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
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
}
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
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
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
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;