2011面向对象C++期末复习习题练习
一、选择题
( D ) 1、C++对C语言作了很多改进,下列描述中使得C语言发生了质变。
A、增加一些新的运算符
B、允许函数重载,并设置默认参数
C、规定函数说明必须用原形
D、引进了类和对象的概念
( D ) 2、下列关于指针的运算中,是非法的。
A、在一定条件下,可以进行相等或不相等的运算
B、可以用一个空指针赋值给某一个指针
C、一个指针可以加上两个整数之差
D、两个指针在一定条件下可以相加
( A ) 3、下列for循环的循环体的执行次数为__________。
for(int i(0),j(10);i=j=0;i++,j--);
A、0
B、1
C、10
D、无限
( D ) 4、在函数说明时,下列项不是必要的。
A、函数的类型
B、函数参数类型和名字
C、函数名字
D、返回值表达式
( A ) 5、友元的作用是
A、提高程序的效率
B、加强类的封装
C、实现数据的隐藏性
D、增加成员函数的种类
( C ) 6、下列运算符中不能重载的是
A、&&
B、[]
C、::
D、new
( C ) 7、关于虚函数的描述中,是正确的。
A、虚函数是一个static类型的成员函数
B、虚函数一个非成员函数
C、基类中说明了虚函数后,派生类中与其对应的函数可以不必说明为虚函数
D、派生类的虚函数与基类的虚函数具有不同的参数个数和类型
( C ) 8、抽象类是指
A、没有实现的类
B、含有虚函数的类
C、含有纯虚函数的类
D、以上都不是( B ) 9、动态释放内存的运算符为:
A、new
B、delete
C、malloc
D、free
( D ) 10、以下声明正确的为
A、double area(double a=2.6,double b);
B、double area(double =2.6,double b,double =4);
C、double area(double a, double b=3.0,double c);
D、double area(double a,double b=3,double c=4);
( D ) 11、下列各种高级语言中,不是面向对象的程序设计语言是( )。
A.C++ B.Java C.https://www.doczj.com/doc/713304426.html, D.C
( B ) 12、下列关于定义一个指向double型变量的指针,正确的是()。
A.int a(5);double *pd=&a;B.double d(2.5),*pd=&d;
C.double d(2.5),*pd=d;D.double a(2.5),pd=&a;; ( C ) 13、下列变量名中,非法的是( )。
A.A25 B.My_car C.My-str D.abc
( C ) 14、下列关于常成员的描述中,错误的是( )。
A.常成员是用关键字const说明的
B.常成员有常数据成员和常成员函数两种
C.常数据成员的初始化是在类体内定义它时进行的
D.常数据成员的值是不可以改变的
( A ) 15、已知:int a(5),&ra=a;下列描述中,错误的是( )。
A.ra是变量a的引用,即为变量的别名B.ra的值为5
C.ra的地址值为&a D.改变ra的值为10,变
量a值仍为5
( D ) 16、下列关于运算符new的描述中,错误的是( )。
A.它可以创建对象或变量 B.它可以创建对
象数组或一般类型数组
C.用它创建对象或对象数组时要调用相应的构造函数 D.用它创建的对
象可以不用delete运算符释放
( D ) 17、下列选择重载函数的不同实现的判断条件中,错误的是( )。
A.参数类型不同B.参数个数不同
C.参数顺序不同D.函数返回值不同
( C ) 18、下列关于构造函数的描述中,错误的是( )。
A.构造函数可以重载B.构造函数名同类名
C.带参数的构造函数具有类型转换作用D.构造函数是系统自动调
用的
( C ) 19、下列运算符中不能重载的是( )
A、+
B、=
C、?:
D、new
( D ) 20、下列关于多继承二义性的描述中,错误的是( )。
A.一个派生类的多个基类中出现了同名成员时,派生类对同名成员的访问
可能出现二义性
B.一个派生类有多个基类,而这些基类又有一个共同的基类,派生类访问
公共基类成员时,可能出现二义性
C.解决二义性的方法是采用类名限定
二、编程
1、编写一个程序,程序中首先声明日期(年,月,日)类Date和时间(时,分,秒)类Time,并由这两个基类派生出日期时间类DateTime,最后在主函数中分别用类的默认构造函数和重载构造函数声明类DateTime类的对象,测试类声明的正确性。
#include
class date{
public:
date(){year=0;month=0;day=0;}
date(int y,int m,int d){year=y;month=m;day=d;}
void setdate(int y,int m,int d){year=y;month=m;day=d;}
void displaydate(){cout< int year,month,day; }; class time{ public: time(){hour=0;minute=0;second=0;} time(int h,int m,int s){hour=h;minute=m;second=s;} void settime(int h,int m,int s){hour=h;minute=m;second=s;} void displaytime(){cout< private: int hour,minute,second; }; class datetime:public date,public time{ public: datetime(){} datetime(int y,int mo,int d,int h,int mi,int s):date(y,mo,d),time(h,mi,s){} void setdatetime(int y,int mo,int d,int h,int mi,int s){ setdate(y,mo,d); settime(h,mi,s); } void display(){ displaydate(); displaytime(); } }; void main(){ datetime d1,d2(1990,1,1,13,20,21); d1.display(); d2.display(); } 2定义一个复数类,类中包括real和image两个数据成员,定义合适的构造函数,重载“+”,“-”,“=”三个运算符。并在主函数中测试。 #include class complex{ public: complex(){real=0.0;image=0.0;} complex(double r,double i){real=i;image=i;} void setcomplex(double r,double i){real=i;image=i;} void display(){cout<<"real is "< complex& operator+(complex& c){ real=real+c.real; image=image+c.image; return *this; } complex& operator-(complex& c){ real=real-c.real; image=image-c.image; return *this; } private: double real,image; }; void main(){ complex c1,c2,c3; c1.setcomplex(1,1); c2.setcomplex(2,2); c3=c1+c2; c3.display(); c1=c1-c1; c3=c1-c2; c3.display(); } 3、设计程序:打印出1~100之间能被9整除的所有整数。 #include void main(){ int i,j; for(i=1,j=0;i<=100;i++) if(i%9==0){ cout< j++; if(j%5==0) cout< } } 4、设计一个含有指针类型的程序: a)定义一个整型变量a,一个整型指针p,一个引用r。 b)通过p把a的值改为10,输出a的值; c)通过r把a的值改为5,输出a的值。 #include void main() { int a,*p=&a; int &r=a; *p=10; cout<<"通过指针修改a的值为"< r=5; cout<<"通过引用修改a的值为"< } 5、设计一个单继承的类层次程序 1)基类Person中有“姓名”、“年龄”等数据成员,包含的成员函数有void PrintNameAge()、构造函数和析构函数,其中PrintNameAge()输出Person对象的“姓 名”、“年龄”等数据成员。 2)派生类Student从Person公有继承,增加数据成员“学号(No)”,包含的成员函数 有void PrintNo()、void PrintNameAge()、构造函数和析构函数,其中PrintNameAge() 输出学生对象的“姓名”、“年龄”等数据成员,PrintNo()输出学生对象的学号。 3)其它成员函数根据需要添加。在主函数中创建一个学生类的对象:Student s("sally",20,1001),调用PrintNameAge()和PrintNo()进行测试。 #include #include class Person { public: Person(){} Person(char *name,int age); ~Person(); void PrintNameAge(); private: char *Name; int Age; }; class Student:public Person { public: Student(){} Student(char *name,int age,int no); ~Student(); void PrintNo(); void PrintNameAge(); private: int No; }; Person::Person(char *name,int age) { Name=new char[strlen(name)+1]; strcpy(Name,name); Age=age; } Person::~Person() { delete []Name; } void Person::PrintNameAge() { cout<<"name:"< cout<<"age:"< } Student::Student(char *name,int age,int no):Person(name,age) { No=no; } Student::~Student() {} void Student::PrintNameAge() { cout<<"student:"< Person::PrintNameAge(); } void Student::PrintNo() { cout<<"No:"< } void main() { Student s("sally",20,1001), s.PrintNameAge(); s.PrintNo(); } 6编写函数void T(int x[],int n)(其中n为数组x的元素个数),实现将数组中的元素前后逆置。如:X[5]={1,2,3,4,5}即X[0]=1,X[1]=2,X[2]=3,X[3]=4,X[4]=5,函数调用T(X,5)后,得到X[0]=5,X[1]=4,X[2]=3,X[3]=2,X[4]=1。并用数据在主函数中测试、输出结果。 #include void T(int x[],int n); int main() { int a[5]={1,2,3,4,5}; int i; cout<<"原数组:"; for(i=0;i<5;i++)