C++面试常见题+简答

引用来自“https://github.com/huihut/interview#data-structure

1. const的作用

可修饰变量、指针、引用、类的成员函数,具体功能见原链接

const的指针里有顶层const和底层const之分,顶层const说明指针不可改变,底层const说明指针指向的值不可改变;

 

2. static的作用

可修饰普通变量、普通函数、成员变量、成员函数,作用各不相同,具体见原链接

 

3. this指针介绍一下

右值,不能取地址&this, 指向类内调用成员函数的对象, 成员函数调用时隐式使用this指针

 

4. inline内联函数介绍一下

相当于宏,但多了类型检查,具有函数特性,一般不包含循环、递归、switch等复杂操作,

在类声明中定义的函数自动隐式地当成内联函数处理;

相比宏函数的优缺点

#优点
提高运行速度,省去了参数压栈等函数操作
有安全检查和自动类型转换
可以访问类的成员变量
可调试

#缺点
代码膨胀
改变Inline函数需要重新编译
是否内联取决于编译器而不是程序员

 

5. 虚函数可以是内联函数吗?

可以,但虚函数表现多态性的时候不能内联,因为虚函数的多态性表现在运行期,只有编译器知道所调用的对象是哪个类才能内联,想想类声明中定义的内联虚函数;

 

6. volatile关键字起什么作用?

类型修饰符,用volatile声明的变量可以被编译器未知的因素(操作系统等)更改,

每次访问时都必须从内存中取值, const可以是volatile, 指针可以是volatile

 

7. assert()起什么作用?

宏,非函数,如果断言的条件为假,则程序终止运行,可以在源代码开头加入#define NDEBUG关闭断言

 

8. sizeof()起什么作用?

对数组返回数组所占空间的大小,对指针返回指针本身所占空间大小

 

9. #pragma pack(n)起什么作用?

设定结构体、联合以及类成员变量以n字节方式对齐, 大部分编译器会自动完成此功能

详见https://www.cnblogs.com/flyinggod/p/8343478.html

 

10. 位域(bit-fields)是什么?

用二进制位来表示变量,布局是大端还是小端与机器有关,

类型必须是整型或枚举;不能用取地址运算符&作用于位域

 

11. extern关键字的作用?

置于变量或函数前,表示该变量或函数在别的文件中定义

与static相反,static声明的变量表示只能在该文件中使用,extern声明的变量从别的文件中定义

extern "C" 声明的代码块让C++编译器按C语言代码处理

 

12. struct 和 typedef struct的区别

C中区别不大,C++中如果定义了struct __后的同名函数,则只表示函数而不是类

 

13. struct 和 class的区别?

默认访问控制,struct是public, class是private,

因此struct更适合看成一个数据结构的实现体,而class更适合看成一个对象的实现体;

 

14. union联合体介绍一下?

是一种节省空间的特殊的类,可以有多个数据成员,但是只有一个数据成员可以有值;

默认访问控制为public, 不含引用,不可继承,不可作为基类,不能有虚函数

 

15. explicit关键字的作用?

修饰构造函数式防止隐式转换和复制初始化,修饰转换函数时防止隐式转换(按语境转换除外)

 

16. friend友元类和友元函数的功能

访问私有成员,破坏封装性,友元关系不可逆、不可继承,友元声明的数量不受限制

 

17. using的作用

对命名空间权限管理, using namespace std;

类似typedef重命名,但是更直观, using INTptr = int*;

继承体系中改变继承的权限, using Base::func;

 

18.  :: 范围解析运算符的作用

::前指明作用域的范围,可以是全局作用域(::前面什么都没有),类作用域(::前是类名),命名空间作用域;

 

19. decltype关键字的作用

用于检查实体的声明类型或表达式的类型及值分类, decltype(expr)

 

20. 左值引用(&)和右值引用(&&)

左值一般表示对象的身份,右值表示其值,

右值引用可以消除不必要的对象拷贝

 

21. 引用折叠是什么

X& &、X& &&、 X&& &,可以折叠成X&

X&& &&可折叠成X&&;

 

22. 宏是什么?

可以实现类似函数的功能,但实际上只是对参数的一对一替换

 

23. 成员初始化列表有什么好处?

高效,少了一次调用默认构造函数;

常量成员、引用类型、没有默认构造函数的情况下,必须使用初始化列表

 

24. initializer_list列表初始化

用花括号初始化器列表初始化一个对象,如vector<int>({1,2,3,4});

 

25. 面向对象三大特征是哪些?

封装、继承、多态

 

26. 什么是封装?

关键字public,protected,private, 把事物封装成抽象的类,并且将数据以不同访问权限隐藏

 

27. 什么是继承?

派生类(子类)继承基类(父类)的功能和成员

 

28. 什么是多态?

多种状态,可以理解为消息以多种形式显示的能力;多态以封装和继承为基础;

分编译期实现静态多态(重载,类模板,函数模板)和运行期实现动态多态(虚函数,自定义类型转换)的多态

静态函数、构造函数、普通函数(非类成员函数)不能是虚函数

 

29.  虚析构函数有什么作用?

析构函数可以是虚函数,用来解决用基类指针删除派生类对象;

 

30. 纯虚函数有什么作用?

在抽象类中无法给出有意义的实现的函数,留给派生类去实现,virtual A() =0

 带纯虚函数的类叫抽象类

 

31. 虚继承解决了什么问题?

解决多继承条件下的菱形继承问题;一般通过虚基类指针和虚基类表实现;

虚基类在子类里存在拷贝,但是只有一份,因而解决了二义性和储存空间浪费的问题

 

32. 区分一下抽象类、接口类、聚合类?

抽象类:含有纯虚函数的类;

接口类:仅含有纯虚函数的抽象类;

聚合类:所有成员都是public,没有构造函数,没有类内初始化,没有基类和虚函数

 

33. new 和 delete具体做了什么?

new/new[],先底层调用malloc分配内存,然后调用构造函数

delete/delete[], 先调用虚构函数,然后底层调用free()释放空间

 

34. delete this合法吗?

合法,但必须保证delete this后面不再使用 this对象

 

35. 如何定义一哥只能在堆上(栈上)生成对象的类?

只能堆上(只能用new 动态构造),把析构函数设为private或Protected,

只能栈上(只能用 A a静态构造),把new,delete重载为private或protected

 

36. 智能指针是什么,怎么用?

头文件<memory>, C++11中有4种智能指针, shared_ptr, unique_ptr, weak_ptr, auto_ptr(被弃用)

shared_ptr, 智能指针可以共享同一个对象,最后一个指针自动销毁对象

weak_ptr, 允许共享但不拥有对象,一旦最后一个拥有对象的智能指针失去了所有权,任何weak_ptr都会自动成空(empty),可打破环状引用

unique_ptr, C++11才开始提供的类型,在异常时可以避免资源泄露,采用独占式拥有,一旦拥有者不再拥有该对象(销毁、空、或者拥有另一对象),先前拥有的对象就会自动销毁,取代auto_ptr;

 

37. 介绍一下有哪几种强制类型转换运算符

static_cast, 用于非多态类型,不执行检查,通常用于转换数值数据类型,可以在类层次结构中移动指针,向上转换安全

dynamic_cast, 用于多态类型,执行检查,只适用于指针或引用,可以在类层次结构中移动指针,包括向上转换、向下转换

const_cast,用于删除const,volatile的特性

reinterpret_cast, 允许将任何指针转换为其他指针类型和整数类型,不能丢掉const/volatile特性,一个实际用途是在哈希函数中

bad_cast, 由于强制转换拾贝,dynamic_cast引发的异常

 

引用来自“https://www.nowcoder.com/discuss/57942?type=all&order=time&pos=&page=2&channel=-2&source_id=search_all

38. C与C++的区别(面向对象的特点),看25

 

39. 指针和引用的区别

引用是别名,指针是地址

 

40. 悬空指针和野指针有什么区别?

原来指向一个对象但是被回收的叫悬空指针(dangling pointer),没有初始化的指针叫野指针(wild pointer)

 

41. 什么是内存泄漏,怎么产生,如何检测?

申请了内存使用完毕后没有释放而被持续占用,

将分配内存的指针以链表的形式自行管理,使用完毕后删除;或者使用一些插件如leaky

 

42. static、const、define、struct、class、sizeof、strlen之间的联系与区别;

sizeof和strlen的区别在于一个是单目运算符一个是函数

 

43. 32位、64位系统中各种常用内置数据类型占用的字节数?

除了地址*和long类型岁系统位数增加而变大之外,其余基本相同

 

44. 函数指针的作用?由哪些属性唯一决定一个函数指针?

可以将函数作为参数传递给函数,

引用不在代码段中的函数;

 

45.C++中如何唯一确定一个重载函数?重载函数的默认初始化方式?

参数个数

 

46.C++多态的实现机制?虚函数表的内部实现机制?

运行时、编译时

每一个含有虚函数的类都有虚函数表,决定了执行成员函数的时候使用哪一个虚函数

 

47. C++重载、覆盖、隐藏的区别?

重载是函数名相同参数列表不同

覆盖(override)是基类虚函数在派生类中出现了同名函数,形参和返回类型相同函数体不同

隐藏(hide)局部变量或函数隐藏了全局变量或函数,或者覆盖的例子中形参或返回类型不同的同名函数会隐藏;

 

48. 深拷贝和浅拷贝的区别?

当拷贝对象中有指针或者引用成员时容易体现区别

 

49. 派生类中构造函数、析构函数调用顺序?

构造函数调用顺序同声明时基类的顺序,析构函数相反

 

50. C++类中数据成员初始化顺序?

先声明的先初始化,析构相反

 

 

 

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值