习题7及其解答
7.1 选择题
1.在下列运算符中,不能重载的是( b )。
(a) ! (b) sizeof (c) new (d) delete
2.下列关于运算符重载的描述中,( 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;
( 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 = 75
2.
#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. 一个运算符重载函数被定义为成员函数或友员函数,从定义方式、解释方式和调用方式上有何区别?可能会出现什么问题?请用一个实例说明之。
【解答】
以二元运算符为例。
运算符重载 | 定义 | 解释 | 调用 |
成员函数 | 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 &); friend Obj operator op(Obj,Obj); | operator op(Obj) operator op(ObjL,ObjR) | Obj op 或 op Obj ObjL op ObjR 操作数均由参数传递 |
| | | |
可能会出现的问题:
(1)运算符的左右操作数不同,须用友员函数重载;
(2)当运算符的操作需要修改类对象状态时,应用成员函数重载。
(3)友员函数不能重载运算符 = () [] ->
必须要用友员函数重载的运算符 >> <<
程序略。
2. 类类型对象之间,类类型和基本类型对象之间用什么函数进行类型转换?归纳进行类型转换的构造函数和类型转换函数的定义形式、调用形式和调用时机。
【解答】
szny
构造函数可以把基本类型、类类型数据转换成类类型数据;类类型转换函数可以在类类型和基本数据类型之间做数据转换。
| 定义形式 | 调用形式 | 调用时机 |
构造函数 | ClassX::ClassX(arg,arg1=E1,...,argn=En); | 隐式调用 | 建立对象、参数传递时 |
类类型转换函数 | ClassX::operator Type(); | 用类型符显式调用; 自动类型转换时隐式调用 | 需要做数据类型转换时 |
| | | |
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
just a dream nelly}
int main()
{ s obj1( "Visual" ),obj2( " C++" ),obj3;
obj3 = obj1 + obj2;
cout << s() << 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;
}
fox新闻
int main()
{ s obj1( "Visual" ),obj2( " C++" ),obj3;
四级报名入口
obj3 = obj1 + obj2;
cout << s() << 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);
>回馈英文