1. 下列运算符中,不能重载的是( )。 A.! B.sizeof C.new D.delete 答题: A. B. C. D. (已提交) -->参考答案:B 问题解析: |
2. 下列运算符中,不能用友元函数重载的是( )。 A.= B.== C.<= D.++ 答题: A. B. C. D. (已提交) -->参考答案:A 问题解析: |
3. 下列函数中,不能重载运算符的是( )。 A.成员函数 B.构造函数 C.普通函数 D.友元函数 答题: A. B. C. D. (已提交) -->参考答案:B 问题解析: |
4. 如果表达式++i*k中的++和*都是重载的友元运算符,则采用运算符函数调用格式,该表达式还可表示为( )。 A.operator*(i.operator++(),k) B.operator*( operator++(i),k) C.i. operator++(). operator*(k) D.k. operator*( operator++(i)) 答题: A. B. C. D. (已提交) -->参考答案:B 问题解析: |
5. 下列运算符中不能重载的是( )。 A.<= B.>> C.: D.&= 答题: A. B. C. D. (已提交) -->参考答案:C 问题解析: |
6. 下面描述中错误的是( )。 A.只有系统预先定义的运算符才能被重载 B.使用类型转换函数不能把一个类转换为另一个类 C.使用类型转换函数可以把类转换为基本类型 D.类型转换函数只能定义为一个类的成员函数,不能定义为类的友元函数 答题: A. B. C. D. (已提交) -->参考答案:B 问题解析: |
思考题
1.一个运算符重载函数被定义为成员函数或友员函数,从定义方式、解释方式和调用方式上有何区别?可能会出现什么问题?请用一个实例说明之。
【解答】
以二元运算符为例。
运算符重载 | 定义 | 解释 | 调用 |
---|---|---|---|
成员函数 | Obj& operator op(); Obj operator op(object); | Obj.operatorop() ObjL.operator op(ObjR) | Obj op 或opObj ObjLopObjR 左操作数通过this指针指定,右操作数由参数传递 |
友员函数 | friend Obj& operator op(Obj&); friend Obj operator op(Obj,Obj); | operator op(Obj) operator op(ObjL,ObjR) | Objop或 opObj ObjLopObjR 操作数均由参数传递 |
可能会出现的问题:
(1)运算符的左右操作数不同,须用友员函数重载;
(2)当运算符的操作需要修改类对象状态时,应用成员函数重载。
(3)友员函数不能重载运算符 = () [] ->
必须要用友员函数重载的运算符>><<
程序略。
2.类类型对象之间,类类型和基本类型对象之间用什么函数进行类型转换?归纳进行类型转换的构造函数和类型转换函数的定义形式、调用形式和调用时机。
【解答】
构造函数可以把基本类型、类类型数据转换成类类型数据;类类型转换函数可以在类类型和基本数据类型之间做数据转换。
定义形式 | 调用形式 | 调用时机 | |
---|---|---|---|
构造函数 | ClassX::ClassX(arg,arg1=E1,...,argn=En); | 隐式调用 | 建立对象、参数传递时 |
类类型转换函数 | ClassX::operator Type(); | 用类型符显式调用; 自动类型转换时隐式调用 | 需要做数据类型转换时 |
程序设计
1.分别使用成员函数和友员函数编写程序重载运算符“+”,使该运算符能实现两个字符串的连接。
【解答】
(1) 使用成员函数
#include <iostream>
#include<cstring>
using namespace std;
class s
{ public:
s()
{ *str = '\0'; len = 0;
}
s( char *pstr )
{ strcpy_s( str,pstr );
Len = strlen(pstr);
}
char *gets()
{ return str;
}
int getLen()
{ return len;
}
s operator+( s obj );
private:
char str[100];
int len;
};
s s::operator+( s obj )
{ strcat_s( str,obj.str );
return str;
}
int main()
{ s obj1( "Visual" ),obj2( " C++" ),obj3(" language");
obj3 = obj1 + obj2 + obj3;
cout << "obj3.str = "<<obj3.gets() << endl;
cout<<"obj3.len = "<<obj3.getLen()<<endl;
}
(2)使用友员函数
#include <iostream>
#include<cstring>
using namespace std;
class s
{ public:
s()
{ *str = '\0'; len = 0;
}
s( char *pstr )
{ strcpy_s( str,pstr );
len=strlen(pstr);
}
char *gets()
{ return str;
}
int getLen()
{ return len;
}
friend s operator+( s obj1, s obj2 );
private:
char str[100];
int len;
};
s operator+( s obj1, s obj2 )
{ strcat_s( obj1.str,obj2.str );
return obj1.str;
}
int main()
{ s obj1( "Visual" ),obj2( " C++" ),obj3(" language");
obj3 = obj1 + obj2 + obj3;
cout << "obj3.str = "<<obj3.gets() << endl;
}
|