C++笔试面试题收录
Posted shutong-jiuke
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++笔试面试题收录相关的知识,希望对你有一定的参考价值。
1.c和c++中struct有什么区别?
①.c中没有保护权限,不能定义函数,但可以有函数指针。
②.c++中有保护权限默认是private,可以定义函数。
2.c++中的struct和class有什么区别?
①.继承权限不同:struct 按照public权限继承而class按照private权限继承。
②.成员的默认访问权限不同:class的成员默认是private权限,struct的成员默认是public。
3.引用和指针有什么区别?
①.通过指针变量操作指针指向的目标属于间接操作。
②.引用本身就是目标变量的别名,对引用的操作就是操作目标本身。
③.引用在定义时必须初始化,而且绑定对象后不能更改。指针则不必。
④.不存在空的引用。但可以存在指向空值的指针。
4.c++中值得传递方式有几种?
①.值传递
②.地址传递
③.引用传递
5.什么是内联函数,应用什么实现?
①.内联函数(就是对于一个频繁使用的短小函数)用关键字inline(内联函数要做参数类型检查)
②.c中使用宏定义(宏是原样替换,不做类型检查),
③.宏定义和内联函数存在本质的区别,转换的时候应考虑是否转换后功能是否正常。
6.c++中virtual 与inline的含义分别是什么?
①.virtual 关键字,类成员函数声明前加virtual关键字修饰,则该成员函数为虚函数。
②.inline 关键字,在函数定义前加inline修饰,则该函数为内联函数。
note:inline 是一种用于实现的关键字,而不是用于声明的关键字。
7.函数assert的用法?
①.assert为断言。仅在Debug版本起作用,用于检查不该发生的情况。
当值为假时,现向stderr打印一条出错信息。然后调用abort终止程序。
8.const 与 #define比较,有什么优点?
①.宏常量没有数据类型而const有数据类型,编译器可对其进行类型安全检查。
②.有些调试工具可以对const常量调试,而不能对宏常量调试。
9.malloc/free 与 new/delete的区别?
①.malloc/free是c++标准库函数,new/delete是c++的运算符。二者都可以动态申请内存和释放内存
②.malloc/free无法满足动态对象的要求,即构造函数与析构函数的自动执行。所以出现了new/delete
note:new/delete 不是库函数。
10.c++是不是类型安全的?
①.不是,不同类型可以进行强制转换。
11.c++中const关键字?
①.const修饰变量: 该变量为只读变量,const变量必须初始化。
②.const修饰指针:
1)修饰指针指向的变量:指针指向的变量为只读变量,不能通过指针修改变量的值,但可以改变指针的指向。
eg: const int *p;
2)修饰指针本身:即该指针为常量型指针,不能修改其指向,可以通过指针修改指向变量的值
eg:int * const p;
③.const 修饰形参变量:函数内部不能够改变这个参数的值。
④.const 修饰返回值:主要用于函数返回const引用,不能够通过函数返回的引用对实际对象进行任何修改。
11.c++中static关键字?
①.修饰全局变量:限制该变量作用域。只能作用域本文件,即使其他文件用extren声明也不可以。
②.修饰局部变量:延长变量生命周期到程序结束。
③.修饰函数:限制作用域,只能作用域本文件,即使其他文件用extren声明也不可以。
④.修饰类成员函数.该成员函数为静态成员函数,没有this指针,它仅能访问类的静态数据和静态成员函数。
⑤.对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。
12. 什么是多态?
①.定义:“一个接口,多种方法”,程序在运行时才决定调用的函数。
②.实现:多态主要通过虚函数实现。
③.目的:接口重用。
④.用法:声明基类指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。
13.多态类中的虚函数表何时建立的?
①.虚函数表是在编译时建立的,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组。
虚表指针是在运行期,也就是构造函数被调用时进行初始化的。是实现多态的关键。
14. sizeof一个空类的大小?
①.类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二的二地址。
同样,空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就有独一无二的地址了。
所以,空类的sizeof为1,而不是0.
15.内存分配指针的方式有几种?
①.从静态存储区分配:例如全局变量。程序结束释放。
②.栈区创建,局部变量等在函数执行结束自动释放。
③.堆区分配,即动态分配,又malloc或new 申请,free或delete释放,生存周期由程序员控制。
16.全局变量和局部变量的区别,编译器如何识别?
①.生命周期不同:
全局变量随主程序的创建而创建,销毁而销毁。
局部变量在局部函数内,函数结束就销毁。
②.编译器通过内存分配的位置识别,全局变量分配在全局数据段,局部变量分配在栈区。
17.Heap与Stack的差别?
①.Heap是堆,空间由程序员手动分配与释放。stack是栈,
②.stack是栈,空间由系统自动分配与释放。
18.c++中explicit关键字
①.explicit关键字用于修饰类的构造函数,表明该类的构造函数是显示,使用者必须显示调用。
19. 重复多次fclose一个打开过一次的FILE *fp指针会有什么结果?请解释。
①.导致文件描述符结构中的指针被重复释放,进而导致不可预期的异常。
20.面向对象的三个基本特征,并简单叙述。
①.封装:将客观事物抽象成类,每个类对自身的数据和方法实行保护(protect private public)
②.继承:广义上的继承有三种方式:
1)实现继承(指的是使用基类的属性和方法而无需额外编码的能力)
2)可视继承(子窗体使用父窗体的外观和实现代码)
3)接口继承(仅使用属性和方法,实现滞后到子类实现。
前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。
③.多态:是将父对象设置成为和一个或更多的与他的子对象相等的技术。
父类指针可以根据子类对象的特性以不同的方式运作。简单说就是允许将子类类型的指针赋值个父类类型的指针。
简而言之,就是接口重用。
21.多态的作用?
①.隐藏实现细节,是的代码能够模块化;扩展代码模块,实现代码重用。
②.接口重用:为了类在继承和派生的时候,保证使用家族中任一类实例的某一属性时的正确调用。
22.重载、覆盖、隐藏 的区别?
①.重载:同一个名字空间 允许存在函数名相同,参数列表不同。
②.覆盖:不同名字空间 用于继承,子类重新定义父类虚函数的方法
③.隐藏:不同名字空间 派生类与基类的函数同名,屏蔽基类的函数。
23.c++里面是不是所有的动作都是由main()函数引起的?
①.全局变量的初始化。
24. 析构函数的用法和作用?
①.析构函数是特殊的成员函数,没有返回类型,没有参数,在对象销毁时有系统自动调用。
②.析构函数可以被virtual修饰(构造函数不能virtual修饰,不存在虚构造)
25.c++中为什么用模板类?
①.编译时检查数据类型,保证类型安全。
②.具有很高的复用性,移植性
③.可用于创建动态增长和减小的数据结构。
26.字符指针、浮点数指针、以及函数指针这三种类型的变量哪个占用的内存最大?
①.32位系统下,不管是指向何种对象的指针变量都占4字节。
27.你是如何使用return语句的?
①.return语句不能返回指向 栈内存的指针或者引用。因为该内存会在函数结束时自动销毁。
②.需要明白我们需要返回的是指针还是引用。
28.delete 与 delete[]的区别?
①.delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。
29.子类析构时要调用父类析构函数吗?
①.构造函数调用顺序:先调用父类构造函数,在调用子类构造函数。
②.析构函数调用顺序:先调用子类析构函数,在调用父类析构函数。
30.虚函数、纯虚函数?
①.虚函数:virtual关键字修饰,允许派生类对基类虚函数重新定义
②.纯虚函数:在基类中保留函数名字,派生类根据需要对它重新进行定义。拥有纯虚函数的类称为抽象类。抽象类不予许创建对象实例。
以上是关于C++笔试面试题收录的主要内容,如果未能解决你的问题,请参考以下文章