习题二C++练习(含有答案)

  • 格式:doc
  • 大小:58.00 KB
  • 文档页数:20

习题二一、填空题1. 对运算符进行重载时,不能改变结合性,不能改变操作数个数,不能改变优先级。

2. 当++被重载为后置成员函数时需要 0 个参数。

3. 当++被重载为前置成员函数时需要 1 个参数。

4. 在C++中,运算符重载函数可以是成员函数,也可以是友元函数,还可以是普通函数。

5. 友元破坏了类的封装性特性。

6. 类的友元能够访问这个类的所有成员。

7. 类的静态数据成员的初始化是在类外进行的。

8. 类的静态成员函数没有 this指针。

9. 类的静态成员函数访问该类的非静态成员可以通过参数传递对象来实现。

10. 不能被重载的类成员函数是构造和析构函数。

二、选择题1. 已知类A有一个带double型参数的构造函数,且将运算符“+”重载为该类友元函数,若如下语句:A x(2.5),y(3.6),z(0); z=x+y; 能够正常运行,运算符重载函数operator+ 应在类中声明为( D )。

A. friend A operator+ (double , double) ;B. friend A operator+ ( double , A &);C. friend A operator+ ( A &, double);D. friend A operator+ ( A & , A &);2. 下列关于运算符重载的描述中,正确的是( D )。

A. 运算符重载可以改变操作数的个数B. 运算符重载可以改变优先级C. 运算符重载可以改变结合性D. 运算符重载不可以改变语法结构3. 友元运算符表达式obj1>obj2被C++编译器解释为( A )。

A. operator>(obj1,obj2)B. >(obj1,obj2)C. obj2.operator>(obj1)D. obj1.operator>(obj2)4. 下列关于C++运算符函数的返回类型的描述中,错误的是( C )。

A. 可以是类类型B. 可以是int类型C. 可以是void类型D. 可以是float类型5. 为了区别单目运算符的前置和后置运算,在后置运算符进行重载时,额外添加一个参数,其类型是( D )。

A. voidB. charC. floatD. int6. 以下运算符中,不能在C++中重载的是( A )。

A. ?:B. +C. -D. <=7. 在一个类中可以对一个操作符进行( D )重载。

A. 1种B. 2种以下C. 3种以下D. 多种8. 若类A被说明成类B的友元,则( D )。

A. 类A的成员即类B的成员B. 类B的成员即类A的成员C. 类A的成员函数不能访问类B的成员D. 类B不一定是类A的友元9. 友元的作用是( A )。

A. 提高成员的运行效率B. 加强类的封装性C. 实现数据的隐藏性D. 增加成员函数的种类10. 下列关于静态数据成员的特性描述中错误的是( D )。

A. 说明静态数据成员时前边要加staticB. 静态数据成员要在类体外进行初始化C. 引用静态数据成员时,要在静态数据成员名前加“类名”和作用域运算符D. 静态数据成员不是所有对象所共用的11. 关于友元的描述中,正确的是( C )。

A. 友元函数是成员函数的一种,它可以访问类的私有成员B. 友元函数不能提高程序的运行效率C. 友元函数要在类体内说明D. 友元函数增强了类的封装性和隐藏性12. 用来说明类的友元的是( D )。

A. privateB. protectedC. publicD. friend13. 已知f1和f2是同一个类的两个成员函数,但f1不能调用f2,下列选项中符合要求的是( B )。

A. f1和f2都是静态函数B. f1是静态函数,f2不是静态函数C. f1不是静态函数,f2是静态函数D. f1和f2都不是静态函数14. 下面对于友元函数描述正确的是( C )。

A. 友元函数的实现必须在类的内部定义B. 友元函数是类的成员函数C. 友元函数破坏了类的封装性和隐藏性D. 友元函数不能访问类的保护成员15. 一个类的友元函数或友元类能够通过成员操作符访问该类的( D )A. 私有成员B. 保护成员C. 公有成员D. 所有成员16. 下面对静态数据成员的描述中,正确的是( D )A. 静态数据成员可以在类体内进行初始化B. 静态数据成员不可以被类的对象调用C. 静态数据成员不受private控制符的限制D. 静态数据成员可以直接用类名调用17. C++语言中提供的( B )不是类的成员,但具有类成员的特权。

A. 构造函数B. 友元函数C. 虚函数D. 重载函数18. 下列关于静态成员函数的说法中不正确的是( C )A. 静态成员函数不属于对象成员B. 对静态成员函数的引用不需要使用对象名C. 静态成员函数中可以直接引用类的非静态成员D. 静态成员函数中可以直接引用类的静态成员19. 下面对友元的错误描述是( D )。

A. 关键字friend用于声明友元B. 一个类中的成员函数可以是另一个类的友元函数C. 友元函数访问对象的成员不受访问特性影响D. 友元函数通过this指针访问对象成员20.下列有关一个类的友元函数的叙述中,正确的( B )A. 允许在类外访问类中除私有成员以外的所有成员B. 允许在类外访问类中的任何成员C. 友元也是该类的成员D. 友元的声明必须被放在该类的公有部分三、判断题1、静态数据成员可以通过类名或对象名引用。

2、静态数据成员可以在类内或类外进行初始化。

3、在静态成员函数中可以访问本类中非静态的数据成员。

4、类的静态成员函数的初始化工作要放在类外进行。

5、若A是B的友元类,B是C的友元类,则A是C的友元类。

6、通过运算符重载,可以定义新的运算符。

7、C++中的所有运算符都能被重载。

8、运算符重载不能改变操作数的个数。

9、运算符重载不能改变其优先级与结合性。

10、在运算符重载函数中不能使用缺省的参数值。

答案:1、√2、×3、√4、×5、×6、×7、×8、√9、√10、√四、程序分析题(写程序运行结果)1. #include <iostream.h>class A{int x,y,z;public:A(int vx,int vy,int vz) { x=vx;y=vy;z=vz;}A() { x=0;y=0;z=0;}A operator+(A t){A te;te.x=x+t.z;te.y=y+t.y;te.z=z+t.z;return te;}A operator-(A t){A te;te.x=x-t.z;te.y=y-t.y;te.z=z-t.z;return te;}A operator=(A t){x=t.x;y=t.y;z=t.z;return *this;}void print() { cout<<x<<" "<<y<<" "<<endl; } };void main(){A t1(10,10,10),t2(20,20,20),t3;t3=t1+t2;t3.print();t3=t2=t1;t1.print();t2.print();t3.print();}答案:30 3010 1010 1010 102. #include <iostream.h>class A{public:A(int r,int c) { row=r;col=c; elem=new int[row*col]; }int& operator()(int x,int y) { return elem[col*x+y]; }int operator()(int x,int y)const { return elem[col*x+y]; } ~A() { delete[] elem; }private:int *elem;int row,col;};void main(){A m(5,8);int i;for( i=0;i<5;i++) m(i,1)=i+5;for( i=0;i<5;i++) cout<<m(i,1)<<",";cout<<endl;}答案:5,6,7,8,9,3. #include <iostream>using namespace std;class goods{private:static int totalweight;int weight;public:goods(int w) { weight=w; totalweight+=weight; }goods(goods &gd) { weight=gd.weight; totalweight+=weight; } ~goods() { totalweight-=weight; }static int gettotal() { return totalweight; }};int goods::totalweight=0;void main(){goods g1(50);cout<<goods::gettotal()<<endl;goods g2(100);cout<<g2.gettotal()<<endl;}答案:501504. #include <iostream>using namespace std;class A{int i,j;static int c;public:A(int a=0,int b=0) { i=a; j=b; c++; } ~A() { c--; }static void f() { cout<<"c="<<c<<endl; } };int A::c=0;void main(){A a(4,8),b,d;{A z(3,6), f;A::f();}A::f();}答案:c=5c=35. #include <iostream>using namespace std;class point{public:void poi(int px=10,int py=10){ x=px; y=py; }friend int getpx(point a);friend int getpy(point b); private:int x,y;};int getpx(point a){ return a.x; }int getpy(point a){ return a.y; }void main(){point p,q;p.poi();q.poi(15,15);cout<<getpx(p);cout<<getpy(p)<<endl;cout<<getpx(q);cout<<getpy(q)<<endl;}答案:101015156. #include <iostream.h>class B;class A{int data;A *prev;public:A(int d,A *n){data=d;prev=n;}friend class B;};class B{A *top;public:B(){top=0;}void push(int i){A *n=new A(i,top);top=n;} int pop(){A *t=top;if(top){top=top->prev;int c=t->data;delete t;return c;}return 0;}};void main(){int c[10]={23,34,56,87,67,876,42,657,55,66};B s;for(int i=0; i<10;i++)s.push(c[i]);for(i=0; i<10; i++)cout<<s.pop()<<",";cout<<endl;}答案:66,55,657,42,876,67,87,56,34,23,7. #include<iostream>using namespace std;class TIME;class DATE{public:D ATE(int a=2004,int m=9,int b=23){year=a; month=m; day=b;}v oid DateTime(TIME &t);private:i nt year,month,day;};class TIME{public:T IME(int h=0,int m=0,int s=0){hour=h; minute=m; second=s;}f riend void DATE::DateTime(TIME&t);private:i nt hour,minute,second;};void DATE::DateTime(TIME&t){c out<<"Nowis"<<year<<'.'<<month<<'.'<<day<<t.hour<<':'<<t.minute<<':'<<t.second<<'.'<<end l;}int main(){DATE b(2004,9,23);TIME t(10,20,50);b.DateTime(t);return 0;}答案:Now is2004.9.2310:20:50.四、编程题1. 定义一个处理日期的类TDate,它有3个私有数据成员:Month,Day,Year和若干个公有成员函数,并实现如下要求:(1)成员函数设置缺省参数;(2)定义一个友元函数来打印日期。