logo资料库

C++笔试题附带答案.docx

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
一:简答题(本题共 25 小题,每题 4 分共 100 分) 1、 什么是类和对象? 答:类是具有共性的实体的抽象; 程序中体现为自定义的数据类型 对象是真是存在的实体,类的实例化; 程序中体现为编译器以为之分配了内存的变量 2、 成员函数通过什么来区分不同对象的成员数据,为什么它能够区分? 答:通过 this 指针,因为每个成员函数都有一个隐含的 this 指针,当对象去调用这个函 数时,会把自己的地址传给 this 指针,以此来区分不同对象的成员数据 3、 拷贝构造函数在哪几种情况下会被调用? 答:三种:1>定义对象时 已经初始化的对象给未初始化的对象赋值时 2>函数的参数是对象时 3>函数的返回值是对象时 4、 什么时候必须重写拷贝构造函数? 答:当有堆操作时 5、 如果定义一个类的对象,该类是一个派生类,并且类中有成员对象时,该对象的构 造过程是怎样的? 答:先调用基类的构造函数,然后调用构造成员的构造函数,最后调用派生类自己的构 造函数 6、 哪几种情况必须用到初始化成员列表? 答:1>涉及到继承的时候,基类的构造函数有参数时 2>有对象成员的时候 3>初始化 const 成员的时候 4>初始化引用成员的时候 7、 静态成员存在的意义? 答:1>代替全局变量,提高程序的稳定性与健壮性、 2>在编译时创建并初始化,在程序内部可以不依赖任何对象被访问 8、 请列举在类外有几种办法可以访问类的非公有成员? 答:1>通过访问共有的成员函数间接的访问类的私有成员
2>定义友元 3>通过该对象的指针来间接访问(用 reinterpret_cast 将对象指针转成 int*,通过该 指针就可以访问成员) 9、 说明 const char *p 和 char * const p; 的区别。 答:第一个修饰的指针所指向的内容 内容不能被改变 本身可以被修改 第二个修饰的是指针本身 说明本身不可以改变 但是指向的内容可以被改变 10、 父类中有一个函数,子类覆盖它的函数想要实现多态的话需要满足什么条件?在 子类函数的前面需要加 virtual 声明吗? 答:在父类的函数前加上 virtual 就可以了。 条件:函数名、函数参数、返回值都要一样 子类的 virtual 可以省略 11、 构造函数和析构函数是否可以被重载,除了这个区别简述它们在函数格式上的其它 区别? 答:构造函数可以被重载 有任意参数 可以赋缺省值 名字与类的名字一样 无返 回值 析构函数不可以被重载 无参数 名字前面加上~ 无返回值 12、 main 函数执行以前,还会执行什么代码? 答:全局对象的构造函数 13、 delete 与 delete []区别: 答:通常来说,去释放指针的时候是没有区别的 但是当你定义了数组,去释放基本 类型的数组也没问题 但是,当你定义了自定义类型的数组时,如果用 delete 而不是 delete[]那么问题来 了,他只会调用 一遍析构函数,如果你调的是 delete[],那么 c++在释放时,会将在分配数组内存 是分配的专门保存 数组大小的空间(四个字节)中取出数组的个数,依次进行析构,就会知道自己到 底要析构多少次 14、 总结通过三种不同的派生方式派生出的类的不同 答: public protected private
公有继承 public protected 不可见 私有继承 private private 不可见 保护继承 protected protected 不可见 15、 什么是指针?谈谈你对指针的理解? 答:指针是一个存放地址的变量 1. 指针是 C/C++语言中一个重要的组成部分,使用指针编程有以下优点: (1)提高程序的编译效率和执行速度。 (2)通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向 数据通讯。 (3)可以实现动态的存储分配。 (4)便于表示各种数据结构,编写高质量的程序。 2. 指针的运算 (1)取地址运算符&:求变量的地址 (2)取内容运算符*:表示指针所指的变量 (3)赋值运算 •把变量地址赋予指针变量 •同类型指针变量相互赋值 •把数组,字符串的首地址赋予指针变量 •把函数入口地址赋予指针变量 (4)加减运算 对指向数组,字符串的指针变量可以进行加减运算,如 p+n,p-n,p++,p--等。对指向 同一数组的两个指针变量可以相减。对指向其它类型的指针变量作加减运算是无意义的。
(5)关系运算 指向同一数组的两个指针变量之间可以进行大于、小于、 等于比较运算。指针可 与 0 比较,p==0 表示 p 为空指针。 3. 与指针有关的各种说明和意义见下表。 int *p; p 为指向整型量的指针变量 int *p[n]; p 为指针数组,由 n 个指向整型量的指针元素组成。 int (*p)[n]; p 为指向整型二维数组的指针变量,二维数组的列数为 n int *p() p 为返回指针值的函数,该指针指向整型量 int (*p)() p 为指向函数的指针,该函数返回整型量 int **p p 为一个指向另一指针的指针变量,该指针指向一个整型量。 4. 有关指针的说明很多是由指针,数组,函数说明组合而成的。 但并不是可以任意组合,例如数组不能由函数组成,即数组元素不能是一个函数; 函数也不能返回一个数组或返回另一个函数。例如 int a[5]();就是错误的。 5. 关于括号 在解释组合说明符时, 标识符右边的方括号和圆括号优先于标识符左边的“*”号, 而方括号和圆括号以相同的优先级从左到右结合。但可以用圆括号改变约定的结合顺序。 因此 a 是一个函数指针变量,该函数返回的一个指针值又指向一个指针数组,该指 针数组的元素指向整型量。 16、 谈谈指针与引用的区别。 答:1>指针是一个实体;而引用仅是个别名 2>引用使用时无需使用*;指针则需要
3>引用只能在定义时被初始化一次,之后不可变;指针则可变 4>引用不能为空;指针可以 5>“sizeof”引用得到的是所指向变流量(或对象)的大小;而“sizeof”指针得到 的是指针本身的大小 17、 总结 const 的应用和作用? 答:1>const 修饰常量 const int a = 10;说明 a 是一个常量不可变;但是 int 和 const 的顺 序是可变的,意思一样 2>const 修饰指针 ①const int *a = &b; 指针本身可变,但是指向的内容不可变 ②int *const a = &b; 指针本身不可变,但是指向的内容可变 ③const int* const a = &b; 指针本身和所指向的内容都不可变 3>const 修饰引用 const int &a = 100; 不能改变引用的值 4>const 修饰函数返回值时 const int fun(); 返回值不能被修改 5>const 修饰函数参数时 int fun(const int a); 函数体内不能修改该参数 6>const 修饰数据成员时 只能通过初始化列表来进行初始化的工作 7>const 修 饰 成 员 函 数 时 成 员 函 数 体 内 不 能 修 改 该 类 内 的 任 何 数 据 成 员 mutable 成员例外 作用: 1>防止意外的修改,提高程序的健壮性(保护一些不想被修改的东西) 2>跟宏定义一样,不变则以,一般都变(可以方便的进行参数的修改和调整) 3>节省内存空间,避免不必要的内存分配 4>提高效率 18、 对于一个频繁使用的短小函数,在 C 语言中应用什么实现,在 C++中应用什么实现? 答:在 C 语言中,用宏定义 在 c++中,用内联函数(inline) 19、 C++函数中参数的传递方式有几种?简单分析下它们的区别? 答:有三种,分别是:
1>值传递 形参时实参拷贝,改变形参的值并不会影响外部实参的值。从被调用 函数的角度来说,值传递是单向的,只能穿入,不能传出。如果当函数的内部需要修改参数, 有不希望这个改变影响到调用者时,采用值传递。 2>指针传递 指针传递传过去的是地址,形参是一个指向外部实参地址的指针,当 *取内容进行改变是,改变的是实参地址中的内容,所以实参改变。 3>引用传递 引用传递实际上修改的是实参自己,所以修改了就修改了 20、 什么是函数重载?在函数重载时要注意什么? 答:定义:c++中出现同名函数的现象称为函数重载 注意:要注意重载函数的调用是依据什么来区分的 是通过函数参数的不同来确 定 参数个数、参数类型、或者参数顺序 如果重载函数有默认值,要注意其二义性 21、C++中的友元是什么?有几种友元关系?在友元处理时需要注意什么问题?友元的 特性是什么? 答:友元是一种类外函数或者类能够访问类中的私有成员的一个途径,可以是函数,也 可以是类。 友元可以分为:友元函数、友元成员、友元类 注意问题: 1>友元函数或者友元成员函数一般都带有类的入口参数; 2>使用时如果是友元函数的话不需要加“类名::” 3>在使用友元成员函数或者友元类的时候,要有“向前引用”,定义顺序不能改变 4>在使用友元类时,其关键字是"friend class",而不是"friend 类名"。 特性: 1>友元是单向的,不具有交换性 2>友元不具有传递性 3>友元不具有继承性 22、 试说明面向对象编程中的多态性是怎么回事? 答:多态性简单来说就是多种表现形式。可以用“一个对外接口,多种内在实现方法” 来表示。有静态多态和动态多态之分。静态多态可以理解为咱们学过的函数重载,是通过静
态联编来实现的,在编译阶段就已经确定的;而动态多态来哪,是通过动态联编实现的,函 数的确定是在程序运行时完成的。 23、 试说明面向对象编程中的继承性是怎么回事?为什么要有这种特性? 答:1>避免公用代码的重复开发,减少代码和数据的冗余 2>通过增强一致性来减少模块间的接口和界面 3>在既有类的基础上增加少量代码得到新类 24、 C++中的结构与 c 中结构的区别是什么?c++中关键字 struct 和 class 又有什么样的 区别? 答:c 与 c++中结构有什么不同: 1>c++在定义一个结构体变量时可以省略关键字 struct,C 语言不可以 2>c++结构体中可以封装函数,C 语言不可以,只能是数据成员 3>c++的结构体成员可以设置访问权限,C 语言没有 c++中 struct 和 class 区别: 唯一的区别就是默认访问权限不一样。类的默认访问权限是 private,结构体的默 认访问权限是 public 25、 谈谈你对动态多态的理解? 答:是对于相关的对象类型,确定它们之间的一个共同功能集,然后再基类中把这些公 共的功能声明为多个公共的虚函数接口。子类重写这些虚函数,来完成具体的功能。你可以 通过指向基类的引用或者指针来完成操作这些个对象,那么对于虚函数的调用,会在函数内 部触发动态绑定,自动的绑定到子类中,从而实现多态。
分享到:
收藏