博学谷——让IT教学更简单,让IT学习更有效 p->getperim(); }
void main() { shape *p; //基类指针 rectangle a(3, 4, 5); //构造矩形对象 circle b(10); //构造圆形对象 p = &a; //基类指针指向矩形 show(p); p = &b; //基类指针指向圆形 show(p); system(\}
第四章题目
一、填空题
1、运算符重载的本质是,它也是C++的一种体现,为用户提供了一个直观的接口,调用运
算符操作自定义数据类型其实就是调用运算符函数。 2、运算符重载时其函数名由构成。成员函数重载双目运算符是,左操作数是,右操作数是。 3、重载之后的运算符不能改变其和,也不能改变其操作数的个数及语法结构。
4、如果是单目运算符重载为类的成员函数,则要分为前置与后置运算符,如果是前置运算符,则它的操作数是函数调用者,函数没有参数;如果是后置单目运算符,则函数要带一个,这个整型参数不起任何作用,只是用来区分前置与后置。 二、选择题
5、下列关于插入运算符”<<”的重载的描述中,错误的是()。 A、运算符函数的返回值类型是ostream B、重载的运算符必须定义为类的成员函数 C、运算符函数的第一个参数的类型是ostream D、运算符函数有两个参数
6、现需要对list类重载”==”运算符,以下函数声明正确的是() A、friend bool operator== (const Student& st1, const Student& st2); B、bool operator== (const Student& st1); C、friend list operator== (const Student& st1);
D、bool operator== (const Student& st1, const Student& st2);
7、在重载一个运算符时,其参数表中没有任何参数,则下列描述中正确的是() A、作为友元函数重载的一元运算符 B、作为成员函数重载的一元运算符 C、作为友元函数重载的二元运算符 D、作为成员函数重载的二元运算符
8、下列关于运算符重载的描述中,正确的是( ) A、所有运算符都可以重载
B、通过重载,可以使运算符应用于自定义的数据类型 C、通过重载,可以创造原来没有的运算符
博学谷——让IT教学更简单,让IT学习更有效
D、通过重载,可以改变运算的优先级 三、判断题
9、运算符重载可以创建新运算符。
10、C++中有5个运算符不可以重载:类属关系运算符“.”、成员指针运算符“*”、作用域
运算符“::”、sizeof运算符和三目运算符“?:”。 11、有4个运算符必须重载为类的成员函数:赋值(=)、下标([])、调用(())、成员访问
箭头(->)。 12、
四、简答题
13、请阅读下面的程序,分析程序是否能通过编绎,如果不能写出原因;如果能,写出运行结果。
#include
class Point { int x, y; public: Point(int x = 0, int y = 0) { this->x = x; this->y = y; cout << \ } Point & operator++() { x++; y++; cout << \ return *this; } Point operator++(int) { Point temp; temp = *this; ++(this->x); ++(this->y); cout << \ return temp; } friend ostream & operator<<(ostream &os, Point&p) { os << \ return os; }
博学谷——让IT教学更简单,让IT学习更有效
~Point(){ cout << \};
void main() { Point P1(10, 20); cout << P1++ << endl; cout << ++P1 << endl; system(\}
14、请简述运算符重载有哪些形式,各有什么特点。 15、请按照下列要求编写程序: 要求:
1)定义复数类型Complex; 2)通过重载加号“+”、减号“-”运算符完成两个复数的相加; 3)将加减号重载为类的友元函数。
第四章答案
1、函数重载 多态
2、operator运算符对象函数参数 3、优先级 结合性 4、整型参数 5、B 6、AB 7、B 8、B 9、错 10、对 11、对 12、
13、能通过编绎。 运行结果:
call the default constructor! call the default constructor! call the Post_Selfplus! call the destructor! Point P2:10;20
call the destructor! call the Pre_Selfpuls! Point P2:12;22
14、运算符重载有两种形式:重载为类的成员函数和重载为类的友员函数。 成员函数运算符与友元函数运算符也具有各自的一些特点:
博学谷——让IT教学更简单,让IT学习更有效
(1)一般情况下,单目运算符最好重载为类的成员函数,双目运算符最好重载为类的友员函数。
(2)若一个运算符的操作需要修改对象的状态,选择重载为成员函数较好。
(3)若运算符的操作数(尤其是第一个操作数)希望有隐式类型转换,则只能选用友元函数。 (4)具有对称性的运算符可能转换任意一端的运算对象,如算术、关系运算符等,通常重载为非成员函数。
(5)有4个运算符必须重载为类的成员函数:赋值(=)、下标([])、调用(())、成员访问箭头(->)。 15、
#include
class Complex{ private: double real, image; public: Complex() { real = image = 0; } Complex(double r, double i) { real = r; image = i; } void print(); friend Complex operator+(Complex c1, Complex c2); friend Complex operator-(Complex c1, Complex c2); };
void Complex::print() { if (image > 0) cout << real << \ else if (image < 0) cout << real << \ else cout << real << endl;; }
Complex operator+(Complex c1, Complex c2) { return Complex(c1.real + c2.real, c1.image + c2.image); }
Complex operator-(Complex c1, Complex c2) { return Complex(c1.real - c2.real, c1.image - c2.image); }
int main(void)
博学谷——让IT教学更简单,让IT学习更有效 { }
Complex c1(2, 3), c2(4, 5); Complex c; c = c1 + c2; c.print(); c = c1 - c2; c.print();
system(\return 0;
第五章题目
一、填空题
1、声明模板的关键字是,定义模板形参的关键字是。 2、C++中的模板可分为和。 3、已知:
int sum(int n){return n+n;} double sum(double n){return n+n;}
是两个函数模板的实例,则该函数模板的定义为。 4、函数模板实例化后是,类模板实例化后。 二、选择题
5、下列关于函数模板的描述中,错误的是()
A、函数模板必须由程序员实例化为可执行的模板函数 B、函数模板的实例化由编绎器实现 C、函数模板是一个可以直接使用的函数 D、函数模板的模板形参不能为空 6、有函数模板定义如下: template
Max(T a, T b, T& c){c = a + b ;} 则下列调用中正确的是() A、int x, y; char z; Max(x, y, z); B、double x, y,x; Max(x, y, z); C、int x, y; flaot z; Max(x, y, z); D、float x, double y, z; Max(x, y, z); 7、类模板的实例化()。 A、在编译时进行 B、属于动态联编 C、在运行时进行 D、在链接时进行
8、下列有关模板和继承的叙述,正确的是 ()