一:简答题(本题共 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、 谈谈你对动态多态的理解?
答:是对于相关的对象类型,确定它们之间的一个共同功能集,然后再基类中把这些公
共的功能声明为多个公共的虚函数接口。子类重写这些虚函数,来完成具体的功能。你可以
通过指向基类的引用或者指针来完成操作这些个对象,那么对于虚函数的调用,会在函数内
部触发动态绑定,自动的绑定到子类中,从而实现多态。