东北农业大学20秋《面向对象程序设计》作业考核试题
试卷总分:100 得分:100
一、单选题 (共 5 道试题,共 10 分)
1.假定有“struct BOOK{char title[40]; float price;}; BOOK *book;”,则不正确的语句为( )。.
A.BOOK *x=new book;
B.BOOK x={“C++ Programming”,27.0};
C.BOOK *x=new BOOK;
D.BOOK *x=book;
2.假设所有变量均为整型,表达式(a=2,b=5,a>b?a++:b++,a+b)的值是( ) 。
A.7
B.8
C.9
D.2
3.当类中一个字符指针成员指向具有n个字节的存储空间时,它所能存储字符串的最大长度为( )。.
A.n
B.n+1
C.n-1
D.n-2
4.当一个类对象离开它的作用域时,系统自动调用该类的( )。.
A.无参构造函数
B.带参构造函数
C.拷贝构造函数
D.析构函数
5.一个类的成员函数也可以成为另一个类的友元函数,这时的友元说明( )。.
A.需加上类域的限定
B.不需加上类域的限定
C.类域的限定可加可不加
D.不需要任何限定
二、简答题 (共 5 道试题,共 30 分)
6.简述什么是对象,并举例说明。
7.简述类对其成员的三种存储控制及作用结果。
8.简述什么是浅拷贝和深拷贝。
9.简述静态成员函数与一般成员函数的主要差别。
10.简述多继承中构造函数被调用顺序。
三、其他题 (共 4 道试题,共 60 分)
11.请写出下面程序的运行结果: #include class Tdate{ public: Tdate(); Tdate(int d); Tdate(int m,int d); Tdate(int m,int d,int y); //其他公共成员 protected: int month; int day; int year; }; Tdate::Tdate() { month=4; day=15; year=1995; cout <<month <<“/” <<day <<“/” <<year <<endl;} Tdate::Tdate(int d) { month=4; day=d; year=1996; cout <<month <<“/” <<day <<“/” <<year <<endl;} Tdate::Tdate(int m,int d) { month=m; day=d; year=1997; cout <<month <<“/” <<day <<“/” <<year <<endl;} Tdate::Tdate(int m,int d,int y) { month=m; day=d; year=y; cout <<month <<“/” <<day <<“/” <<year <<endl;} void main() { Tdate aday; Tdate bday(10); Tdate cday(2,12); Tdate dday(1,2,1998);
12.请写出下面程序的运行结果: 程序:#include class OBJ1{public: OBJ1(){ cout <<“OBJ1\n”; }}; class OBJ2{public: OBJ2(){ cout <<“OBJ2\n”; }}; class Base1{public: Base1(){ cout <<“Base1\n”; }}; class Base2{public: Base2(){ cout <<“Base2\n”; }}; class Base3{public: Base3(){ cout <<“Base3\n”; }}; class Base4{public: Base4(){ cout <<“Base4\n”; }}; class Derived :public Base1, virtual public Base2, public Base3, virtual public Base4{ public: Derived() :Base4(), Base3(), Base2(), Base1(), obj2(), obj1() { cout <<“Derived ok.\n”; } protected: OBJ1 obj1; OBJ2 obj2;}; void main(){ Derived aa; cout <<“This is ok.\n”;}
13.根据下面类中Reverse1函数成员的原型和注释写出它的类外定义。 class AA { int* a; int n; int MS; public: void InitAA(int aa[], int nn, int ms) { if(nn>ms) {cout<<“Error!”<<endl; exit(1);} MS=ms; n=nn; a=new int[MS]; for(int i=0; i<MS; i++) a[i]=aa[i]; } AA* Reverse1(); //通过动态存储分配得到一个对象,并动态分配 //a[MS]数组空间,要求该对象中的n和MS的值与*this中的 //对应成员的值相同,数组元素的值是按照*this中数组元 //素的相反次序排列得到的,要求该函数返回动态对象的地址。 };
14.程序: #include #include class Point{ public: void Set(double ix,double iy) //设置坐标 { x=ix; y=iy; } double xOffset() //取y轴坐标分量 { return x; } double yOffset() //取x轴坐标分量 { return y; } double angle() //取点的极坐标 { return (180/3.14159)*atan2(y,x); } double radius() //取点的极坐标半径 { return sqrt(x*x+y*y); } protected: double x; //x轴分量 double y; //y轴分量 }; void main() { Point p; double x,y; for(;;){ //重复输入x和y轴分量,直到x分量值小于0 cout >x >>y; if(x<0) break; p.Set(x,y); cout <<“angle=” <<p.angle() <<“,radius=” <<p.radius() <<“,x offset=” <<p.xOffset() <<“,y offset=” <<p.yOffset() <<endl; } } 问题: 根据类的封装性,不改变该类的公有接口,不改写主函数的情况下,只改变该点类的定义与实现,要求把原有点类的私有成员x,y改写成另外两个私有数据成员a,r分别代表该点在极坐标系下的弧度值和半径值。请写出修改后的类的定义与实现。