好文档 - 专业文书写作范文服务资料分享网站

C++经典面试题及答案

天下 分享 时间: 加入收藏 我要投稿 点赞

1. new、delete、malloc、free关系

delete会调用对象的析构函数,和new对应。

free只会释放内存,new调用构造函数。malloc 与 free 是C++/C 语言的标准库函数,new/delete 是 C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用 maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于 malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析 构函数的任务强加于 malloc/free。因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符 new,以及一个能完成清理与释放内存工作的运算符delete。注意 new/delete 不是库函数。

2. C++有哪些性质(面向对象特点)

封装,继承和多态。 在面向对象程序设计语言中,封装是利用可重用成分构造软件系统的特性,它不仅支持 系统的可重用性,而且还有利于提高系统的可扩充性;消息传递可以实现发送一个通用的消息而调用不同的方法;封装是实现信息隐蔽的一种技术,其目的是使类的定义和实现分离。

3. 求下面函数的返回值 int func(x) {

int countx = 0; while(x) {

countx ++; x = x&(x-1); }

return countx; }

假定 x = 9999。 答案:8 思路:将 x 转化为 2 进制,看含有的 1 的个数。

4. 什么是“引用”?申明和使用“引用”要注意哪些问题?

答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名 有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。

5. 在什么时候需要使用“常引用”?

如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const 类型标识符 &引用名=目标变量名;

例 1 int a ;

const int &ra=a; ra=1; //错误 a=1; //正确 例 2

string foo( );

void bar(string & s);

那么下面的表达式将是非法的: bar(foo( ));

bar(\

原因在于foo( )和\串都会产生一个临时对象,而在 C++中,这些临时对象都是 const 类型的。因此上面的表达式就是试图将一个 const 类型的对象转换为非 const 类型,这是非法的。引用型参数应该在能被定义为 const 的情况下,尽量定义为 const 。

6.“引用”与多态的关系?

引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向 它的派生类实例。

例 4 Class A; Class B : Class A{...}; B b;

A& ref = b;

7.面关于“联合”的题目的输出? a) #i nclude union {

int i;

char x[2]; }a;

void main() {

a.x[0] = 10; a.x[1] = 1;

printf(\ }

答案:266 (低位低地址,高位高地址,内存占用情况是 Ox010A) b)

main()

{

union{ /*定义一个联合*/

int i;

struct{ /*在联合中定义一个结构*/

char first; char second;

}half;

}number;

number.i=0x4241; /*联合成员赋值*/

printf(\ number.half.first='a'; /*联合中结构成员赋值*/ number.half.second='b'; printf(\ getch(); }

答案: AB (0x41 对应'A',是低位;Ox42 对应'B',是高位) 6261 (number.i 和 number.half 共用一块地址空间)

8面向对象的三个基本特征,并简单叙述之?

1. 封装:将客观事物抽象成类,每个类对自身的数据和方法实行 protection(private, protected,public)

2. 继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性 和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。 3. 多态:是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

9.多态的作用?

主要是两个: 1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用; 2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性 时的正确调用。

10.New delete 与malloc free 的联系与区别?

答案:都是在堆(heap)上进行动态的内存操作。用malloc 函数需要指定内存分配的字节 数并且不能初始化对象,new 会自动调用对象的构造函数。delete 会调用对象的 destructor,而 free 不会调用对象的destructor.

12.有哪几种情况只能用intialization list 而不能用assignment?

答案:当类中含有 const、reference 成员变量;基类的构造函数都需要初始化表。

13 main 函数执行以前,还会执行什么代码?

答案:全局对象的构造函数会在 main 函数之前执行。

14.struct 和 class 的区别

答案:struct 的成员默认是公有的,而类的成员默认是私有的。struct 和 class 在其他方面是功能相当的。从感情上讲,大多数的开发者感到类和结构有很大的差别。感觉上结构仅仅象一堆缺乏封装和功能的开放的内存位,而类就象活的并且可靠的社会成员,它有智能 服务,有牢固的封装屏障和一个良好定义的接口。既然大多数人都这么认为,那么只有在你 的类有很少的方法并且有公有数据(这种事情在良好设计的系统中是存在的!)时,你也许应该使用 struct 关键字,否则,你应该使用class 关键字。

15. 在 8086 汇编下,逻辑地址和物理地址是怎样转换的?

答案:通用寄存器给出的地址,是段内偏移地址,相应段寄存器地址*10H+通用寄存器内地址,就得到了真正要访问的地址。

16.分别写出BOOL,int,float,指针类型的变量a 与“零”的比较语句。

答案: BOOL :

if ( !a ) or if(a) int :

if ( a == 0) float :

const EXPRESSION EXP = 0.000001 if ( a < EXP && a >-EXP) pointer :

if ( a != NULL) or if(a == NULL)

17.简述数组与指针的区别?

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。

(1) 修改内容上的差别 char a[] = “hello”; a[0] = ‘X’;

char *p = “world”; // 注意 p 指向常量字符串

p[0] = ‘X’; // 编译器不能发现该错误,运行时错误 (2) 用运算符 sizeof 可以计算出数组的容量(字节数)。sizeof(p),p 为指针

得到的是一个指针变量的字节数,而不是 p 所指的内存容量。C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

char a[] = \

char *p = a; cout<< sizeof(a) << endl; // 12 字节

cout<< sizeof(p) << endl; // 4 字节 计算数组和指针的内存容量

void Func(char a[100]) {

cout<< sizeof(a) << endl; // 4 字节而不是 100 字节 }

19. main 主函数执行完毕后,是否可能会再执行一段代码,给出说明? 答案:可以,可以用_onexit 注册一个函数,它会在main 之后执行int fn1(void), fn2(void), fn3(void), fn4 (void); void main( void ) {

String str(\ _onexit( fn1 ); _onexit( fn2 ); _onexit( fn3 ); _onexit( fn4 );

printf( \ }

int fn1() {

printf( \ return 0; }

int fn2() {

printf( \ return 0; }

int fn3() {

printf( \ return 0; }

int fn4() {

printf( \ return 0; }

20.文件中有一组整数,要求排序后输出到另一个文件中 答案:

#include

C++经典面试题及答案

1.new、delete、malloc、free关系delete会调用对象的析构函数,和new对应。free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求
推荐度:
点击下载文档文档为doc格式
81vek28ane52amw9lhr375cln2z0hr008es
领取福利

微信扫码领取福利

微信扫码分享