您的位置:首页 > 编程语言 > C语言/C++

C++面试题汇总(持续更新)

2017-10-25 14:48 288 查看
1.C与C++的区别?

C是面向过程,C++面向对象,C是C++的一个子集,C++还有继承多态分装等特性

2.C++11的新特性?C++14?C++17

C++11:auto关键字,nullptr,for新用法( for(auto a: b) ), 智能指针,匿名函数(lambda)等

C++14:auto关键字扩展,泛型lambda

C++17:

3.指针和引用的区别?

1.指针是一个存储内存地址的变量,指向一个内存单元;引用是变量的别名

2.用const指针,没有const引用

3.指针可以为空,引用必须初始化,不能为null

4.有多级指针,但没有多级引用

5.指针初始化后可以指向其他存储单元,引用初始化后不能改变

4.static和const区别?

const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间

5.const和define的区别?

1.define在预处理阶段展开,const是在编译运行阶段使用

2.define没有类型检查,const在编译器有运行检查

3.define没有分配内存,const会分配存储空间

4.const可以节省空间,const常量在程序运行中只有一份拷贝(静态区), 而define有若干个拷贝

5.编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

6.宏定义只做替换,程序运行时不分配内存

6.define和typedef的区别?

1.typedef常用于定义一个标识符及关键字的别名,不实际分配内存空间;define为宏定义语句,在预处理过程中完成,缺少类型检测

2.typdef和define不同,不仅仅是单纯的类型替换

例如

#define INT int*
typedef int* pINT;
INT a, b;   //a是int*类型,b是int
pINT c, d;  //c和d都是int*


7.struct和class的区别?

1.两者都可以用成员函数,变量,以及可继承

2.struct默认权限为public, class为private

3.struct默认继承方式为public,class为private

8.C++中的重载,覆盖,隐藏的区别?

1.重载:同一作用域内,函数名相同,但是参数的类型与顺序是不同的函数组为重载函数(不考虑返回值类型)

2.覆盖(重写):派生类中存在重新定义的函数。函数名,参数列表与返回值都和基类一致。基类的函数必须要有virtual修饰

3.隐藏:派生类存在和基类函数名相同的函数,基类可以不是virtual函数,参数列表和返回值也可以不同。

9.C++多态的实现,虚函数原理

多态: 指当不同的对象收到相同的消息时,产生不同的动作

1.编译时多态(静态绑定):函数重载,运算符重载

2.运行时多态(动态绑定):虚函数

虚函数:

1.虚函数是通过一张虚函数表实现的(编译器处理虚函数的方法:为每个类对象添加一个隐藏成员,隐藏成员中保存了一个指向函数地址数组的指针,称为虚表指针,这种数组成为虚函数表)

2.虚函数表中主要存放勒种虚函数的地址,用于解决继承,重写的问题

3.继承的时候,若派生类重写了虚函数,则原先指向基类虚函数地址的指针将指向派生类虚函数的地址

11.C++如何实现一个接口

抽象类,使用纯虚函数

12.C++虚继承的作用

用于解决多重继承的问题:

不同对象继承的同一基类会在子类中存在的多份拷贝,浪费存储空间,并且造成二义性

底层的实现:虚继承的时候,子类都会有一个虚基类的指针和虚基类表,所以基类只存在一份拷贝,避免了二义性

13.C++虚析构函数,虚构造函数

1.虚构造函数:C++不能设置虚构造函数,

Delphi可以设置虚构造函数。

14.C++中的构造函数

1.默认构造函数

2.一般构造函数

3.拷贝构造函数

4.转换构造函数

15.四种类型转换的区别

static_cast:

dynamic_cast:

const_cast:

reinpreter_cast:

16.浅拷贝和深拷贝

类中默认的复制构造函数进行的是浅拷贝。

1.浅拷贝只是对指针的拷贝,拷贝后指向同一内存空间;深拷贝不只是对指针拷贝,还对内容进行的拷贝,指向不同的地址

2.浅拷贝容易造成内存泄漏(析构的时候析构了两次)

17.share_ptr, weak_ptr, auto_ptr以及unique_ptr

18.C++的内存模型

1.堆区(动态区):用于存放new分配的变量

2.栈区:用于存放局部变量

3.静态存储区:用于保存全局变量和静态变量

4.常量存储区:存储常量,字符串常量等

5.代码区:存储代码

关于自由存储区网上意见不同,有的认为可以等价于堆区

5.自由存储区:存放malloc分配的变量

19.C++的内存对齐

20.new/delete和malloc/free的区别

1.malloc/free是库函数, new/delete是操作符

2.malloc/free只是单纯的申请空间,new/delete还会调用构造函数和析构函数

3.malloc不抛出异常,new会抛出异常

21.new operator, operator new, placement new的区别

22.STL中Vector的实现

23.STL中unordered_map和map的区别

1.unordered_map底层为hashtable, map底层为红黑树

2.unordered_map是无序的

24.STL中set和map的区别

1.两者的底层都是红黑树

2.set的节点是一个元素,map的节点是一对元素(key和value)

3.元素都会被自动排序

4.都不允许键值重复

5.set不能改变值,因为key=value;map可以通过key改变value

25.STL红黑树的实现

1.红黑树是一个二叉搜索树

2.满足4条规则(a.节点不是红色就是黑色b.根节点为黑色c.如果节点为红色,子节点必须为黑色d.任意节点到null的黑色节点数相同)

3.通过旋转维持红黑树的结构

26.STL hashtable实现

27.STL常见容器的区别,用途

vector:

list:

deque:

28.如何实现一个不可继承的类

28.实现一个string类
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: