C++综合练习题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对象存储方式,在逻辑上我们仍然应该将 每一个对象看作是独立的、不同的个体, 每个对象都有自己的数据成员和成员函 数。 6. 构造函数也是一种成员函数;构造函数的 函数名必须和它所在类的类名相同;构造 函数没有返回值,当然也就没有返回类 型,即使是 void 类型也不允许使用;一个 类可以有多个构造函数,即构造函数可以 被重载;构造函数是在创建对象时被系统 自动调用的, 而不是通过 “. ” 显示调用的, 这也是和一般成员函数在使用上非常明 显的区别。 7. 析构函数也是一种成员函数;析构函数的 函数名必须使用它所在类的类名,且前面 加上一个波浪号;析构函数没有返回值和 返回类型,且没有任何参数;一个类只能 有一个析构函数,即析构函数不能被重 载;析构函数多数情况是在对象生存期结 束时由系统自动调用的,少数情况下也可 以在用户代码中通过“.”显示调用。 8. 一个类的友元函数并不是该类的成员,所
享的数据 B.类的每个对象都有自己的静态数据 成员 C.类的不同对象有不同的静态数据成 员值 D. 静态数据成员不能通过类的对象 调用 5. 下面关于虚函数的描述,错误的是(D ) A.在成员函数声明的前面加上 virtual 修饰,就可把该函数声明为虚函数 B.基类中说明了虚函数后,派生类中 对应的函数也必须说明为虚函数 C. 虚函数可以是另一个类的友元函 数,但不能是静态成员函数 D. 基类中说明的纯虚函数在其任何 派生类中都必须实现 6. int Func(int,int);不可与下列哪个函数构 成重载 (B 不可能返回 double 型数值 ) A.int Func(int,int,int); B.double Func(int,int); C. double Func(double, double); D. double Func(int,double);
出相应的异常处理代码,系统将自动调用 标准库函数 terminate,terminate 默认调用 标准库函数 abort,导致程序终止。 15. 动态联编要满足两个条件,一个是被调 用的成员函数必须是虚函数,另一个是必 须用指针或引用调用该虚函数。 16. 从系统实现角度来看,多态性包括静态 多态性 (编译时多态性) 和动态多态性 (运 行时多态性)两大类。 17. 静态多态性是指通过函数重载和类属 机制来实现的。在程序编译时系统就能确 定调用哪个函数,因此静态函数又称编译 时的多态性。例如:函数重载和运算符重 载就属于这种情况。 18. 动态多态性是指通过虚函数、继承机 制,以及动态绑定机制来实现的。在程序 运行过程中才动态地确定操作指针所指 的对象,主要通过虚函数和重写来实现。 19. 引用在创建的同时必须进行初始化,即 引用到一个有效的对象;而指针在定义的 时候不必立即初始化,可以在定义之后的 任何地方给它赋值。引用一旦被初始化为
一、概念与常识 1. 面向对象的程序设计具有如下的几大基 本特征,它们是抽象、 封装 、继 承 、多态 。 2. 抽象是指从众多的事物中抽取出共同的、 本质性的特征,而舍弃其非本质的特征。 3. 类的封装性是指数据(数据成员)与操作 (成员函数)紧密结合,构成一个不可分 割的整体(对象) ,并且以不同的访问控 制方式(private,protected,public)对这 些成员作出限定。 4. 由同一个类可以定义出不同的对象,不同 对象的数据成员是不同的,所以各对象的 数据成员在内存中占据不同的内存空间 (静态数据成员例外,它存放在类的公用 区;但同一个类的不同对象的成员函数的 代码都是相同的,所以各对象的成员函数 只需要在内存中(类的公用区)存放一份 代码,供大家共用。 5. 同一个类的不同对象共用同一份成员函 数的代码,是 C++为了节省内存而采用的
的外面。函数 fun 被定义为类 A 的友元函 数以后,fun 就可以像是类 A 的成员函数 那样访问类 A 的成员了。 25. 运行时多态性的基础是共有派生类对 基类类型的兼容性,即指向基类对象的指 针可以指向该基类的公有派生类对象,类 似地,基类对象的引用也可以关联到该基 类的公有派生类对象。 找错题: 1、以下程序中哪些语句是错误的?请用双 斜线将它们注解掉。 #include "iostream.h" void main() { const int a1=7; int const a2=8; int c1=9; int c2=10; const int *d1=&a1; const int *d2=&c1; int const* e1=&a1;
A) 在函数体中,一个被声明为静态的变量 在这个函数被调用结束以后,它依然存在且 保留调用结束时的值。 ,一个被声 B) 在源文件内(但在函数体外) 明为静态的变量可以被该源文件内所有的 函数访问,但不能被该源文件外的其它函数 访问。它是一个本地的全局变量。 C) 在源文件内,一个被声明为静态的函数 只可被这一源文件内的其它函数调用。那就 是,这个函数被限制在声明它的源文件的本 地范围内使用。 D) 一个变量只有被声明为 static 以后才是 静态存储的,生存期才是整个程序的运行 期。 3. 在 C++语言中,数据封装要解决的问题是 (D) A.数据的规范化 B.便于数据转换 C. 避免数据丢失 D. 防止不同模块之间数 据的非法访问 4. 下同对静态数据成员的描述中,正确的是 (A) A. 静态数据成员是类的所有对象共
sex=s; strcpy(major, maj); } void display( ) { cout<<"num:"<<num<<endl; cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl; cout<<"major:"<<major<<endl<<endl; // 访问本类保护成员 } }; class student: public stud // 定义一个公有派生类 { private: int age; char addr[50]; public: void show( ) {
是整型变量,d1、d2、e1、e2 都是指向整型 数据(既可以是整型常量也可以是整型变 量)的指针变量,f1、f2、f3 都是指向整型 变量的指针常量,g1 和 g2 都是指向整型数 据的指针常量。 需要特别强调的是, 虽然 d2、 e2、g2 都可以指向一个整型变量,但这并不 等于说就可以通过这些指针去修改那些整 型变量,因为有 const 的保护,所以是不能 去修改那些受保护的整型数据的。 保留字 const 的作用是: 1). 要向阅读代码的人和编译器明确传达一 个非常重要的信息,就是哪些内容是“受保 护的” ,即不能被修改。这既可以增强程序 的可读性,又可以增强程序的健壮性,减少 bug 的出现。 2)const 除了可以用来定义常量以外,还可 以用来修饰函数的参数、返回值,甚至函数 的定义体。 被 const 修饰的东西都受到强制 保护,可以预防意外的变动,能提高程序的 健壮性。 3). 通过给优化器一些附加的信息,使用保 留字 const 也许能产生更紧凑的代码。
student a(2, "Zhang_Yang", 'M', "applications math"); // 定义了一个派生 类对象 a.display( ); // 以上两句,调用从基 类继承来的共有成员函数 a.show(); // 调用派生类自己定 义的共有成员函数 // a.num=10020; // ×企图从外界引 用基类的私有成员 // a.age=18; // ×企图从 外界引用派生类的私有成员 } 选择题:2×10 分 1. 使用值传递方式将实参传给形参,下列说 法正确的是( A ) 。 A.形参是实参的备份 B.实参是 形参的备份 C.形参和实参是同一对象 D.形参 和实参无联系 2. 下面是对 C++中 static 保留字的叙述,错 误的是(D) 。
以不能通过该类的对象来访问,也不能被 该类的子类所继承。 9. 对于从父类继承来的成员,它们在派生类 中的访问控制方式要由父类成员的访问 控制方式和派生类定义时的访问说明来 共同决定。 10. 在公有派生的情况下,基类成员在派生 类中的访问权限保持不变。 函数的参数有两种传递方式, 11. 在 C++中, 一种是值传递方式, 另一种是指针 (地址) 或 引用 传递方式。 12. 当一个成员函数被调用时,该成员函数 的 this 指针指向调用它的对象。 13. 异常处理是指程序设计语言提供的一 种用于管理程序运行期间出现异常的机 制。 异常处理可以提高程序的健壮性。 C++ 语言将程序中的异常处理设计为两个过 程:异常的检测和异常的处理。 14. 异常检测部分在检测到某个异常后可 以使用 throw 语句抛出该异常。异常被抛 出以后,需要有相关的异常处理代码对其 进行捕获和处理,如果程序代码中没有给
2、以下程序中哪些语句是错误的?请用双 斜线将它们注解掉。 #include <iostream.h> #include <string.h> class stud // 定义基类 { private: // 基类私有成员 int num; char name[30]; char sex; protected: // 基类保护成员 char major[15]; public: // 基类公有成员 stud( int n, char nam[], char s, char maj[] ) { num=n; strcpy( name, nam);
display( ); // 引用基类的公有 成员函数 // cout<<"num:"<<num<<" name:"<<name <<" sex:"<<sex <<endl; // ×企图引用基类的私有成员 cout<<"age:"<<age<<endl; // 引 用派生类的私有成员 cout<<"address:"<<addr<<endl; // 引 用派生类的私有成员 strcpy(major, "Computer Science"); cout<<"major:"<<major<<endl<<endl; } // student( int n, char nam[], char s, char maj[],int age1=20):stud(n,s,nam,maj) //与基类 构造函数的参数顺序不对应 { age=age1; strcpy(addr, "四川理工学院"); } }; void main() {
指向一个对象以后,它就不能被改变为另 一个对象的引用;而指针在任何时候都可 以被改变为指向另一个对象。不存在指向 空值的引用,但是存在指向空值的指针。 20. 在 C++中有一种不能定义对象的类,它 只能被继承,这种类称为抽象类,抽象类 在定义时至少要有一个纯虚函数。 21. 在 C++类中, const 关键字可以修饰对象 和成员函数, const 对象不能被修改, const 成员函数不能修改其所在类中的数据成 员。 22. 没有定义在类中的函数,都称为全局函 数。 23. 定义在类中的函数,称为成员函数,其 作用域在该类的内部,它可以访问该类中 的所有成员(包括公有的、保护的、私有 的所有数据成员和成员函数) 。 24. 如果要把一个函数 fun(可以是全局函 数或类的成员函数) 定义为类 A 的一个友 元函数,则需要在类 A 中用保留字 friend 来说明,但该友元函数 fun 并不是类 A 的 成员,所以对 fun 的定义自然应该在类 A
int const* e2=&c1; e2=e1; // *e2=33; int * const f1=&c1; int * const f2=&c2; // int * const f3=&a1; // f2=f1; *f2=33; const int * const g1 =&a2; const int * conΒιβλιοθήκη Baidut g2 =&c2; // g2=g1; // *g2=33; *f1=*g1; cout<<"a1="<<a1<<",a2="<<a2<<",c1="<< c1<<",c2="<<c2<<endl; cout<<"d1="<<*d1<<",d2="<<*d2<<endl; cout<<"e1="<<*e1<<",e2="<<*e2<<endl; cout<<"f1="<<*f1<<",f2="<<*f2<<endl; cout<<"g1="<<*g1<<",g2="<<*g2<<endl; } 分析: 其中,a1 和 a2 都是整型常量,c1 和 c2 都