C++面试题总结

在牛客网上根据别人的面试题总结,顺带复习关键知识点

1.map,unordered_map底层

待详细研究,目前看是pair类型和一个next指针组成的链表,然后把所有单向链表放到vector里

2.static关键字

static关键字可以形容面向过程的变量或函数,也可以在类中成员数据或者成员函数

static int a;该静态全局变量存储在全局静态区,它在整个内存中只存在一份拷贝,它只对于本文件可见,而对于其他文件不可见。所以其他文件可以定义相同名字变量而不会发生错误。

静态局部变量(省略)

static void func();静态全局函数不能被其他文件使用,其他文件中可以定义相同名字变量。

类中的静态数据成员

static int a;它只能在类中声明,在类外定义int classname::a=0;它是被所有类共享的,所有类操作都会改变它的值,当然,无需类实例化也可以改变它的值,classname.a=1;

举例存款类,利率是一样的,所以可以声明为静态 的。

好处:静态数据成员不会和全局变量命名冲突,它可以设置为private,从而隐藏信息,只存在一份减少内存。

静态成员函数

在类中的静态成员函数只有一份,存在全局变量区,它只能在类中声明,在类外定义。

普通成员函数有this指针,而静态成员函数没有。

静态成员函数无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。

静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数

非静态成员函数可以任意地访问静态成员函数和静态数据成员

3.const

C/C++ 基础中的基础: const 修饰符用法总结! - 知乎 (zhihu.com)

const变量

变量值是只读的,不应该被改变,修饰变量后可以借助编译器,如果改变了就报错。推荐使用const来代替一般宏定义,应该const是会检查类型的。

const 结构体

const struct classname;结构体中一般只有数据没有函数,所以const是不允许改变结构体中的数据变量。

const 类

const实例化类的时候是不能改变类的数据的,而且不能调用非const成员函数

const常量指针

const int* ptr;指针指向的值不能改变,但是指针的指向可以改变,this指针即常量指针。

const指针常量

int* const ptr;指针的指向不能改变,但是指针的内容是可以改变的。

常量指针常量

const int* const ptr;指针指向和指向的内容都不可以改变。

const作为函数参数

const声明的函数我们在传参调用时不可以修改参数值,const指针作为参数,调用时可以传入const指针或者普通指针,普通指针可以隐式转换为const指针。但是普通指针作为参数,我们是不能传入const指针的。

const引用返回函数

相当于常量指针常量,不能修改指向及内容。

const类中的成员变量

成员变量修饰const后必须在构造函数中被初始化,并且后续不能修改。静态const 成员变量static const int a;它必须在类外定义初始化。

const成员函数

const修饰的成员函数不能够修改类中的成员变量,参数是this指针的const成员函数是常量指针常量。如果想修改某一成员变量,那么它应该声明为mutable.

4.虚函数

C++面试必备之虚函数 - 知乎 (zhihu.com)

c++面向对象具有的三大特性封装,继承,多态。其中多态的实现虚函数具有重大作用。基类虚函数前面必须加virtual关键字,子类中可不加,有了虚函数,我们可以用基类指针调用不同类对象中的函数。

向上转型:第63行和第64行,发生隐式类型转换,变成了基类类型,但是对象还是各自的对象。

向下转型:第74,75行,和77行,我们将基类类型转换成子类类型,但是dynamic_cast有一点需要注意,尖括号内的是想要的转变后类型,而小括号内需要一个实际的变量,而且这个变量不能是base* 类型的base对象,而应该是base*类型的B对象,而且dynamic_cast基类必须有虚函数

接下来我们来分析一下上述结果,前六行的结果是显而易见的,虚函数调用是根据它实际的对象来进行调用的,而普通函数的调用是根据指针类型来调用的,所以基类指针调用各对象虚函数时,调用的是各对象的虚函数,从而实现了多态,而普通函数使用调用的是base类的函数。下面的转换类型后验证了这一点。

虚函数是怎么实现的?

具有虚函数的类实际上维护了一个虚函数表指针,它指向虚函数表所对应的地址,同时全局区维护了一个虚函数表,普通函数,虚函数,虚函数表是同一类是共有的,私有的是成员变量和虚函数指针变量。所以调用虚函数时会根据对象 找到虚函数表指针,然后定位到虚函数表,找到各对象实现区域的虚函数地址进行调用。

对于普通函数,程序根据指针的类型到代码区找到这个基类函数,然后执行基类函数。

类的构造函数和虚构函数可以是虚函数吗?

类的构造函数不能是虚函数,因为虚函数表指针是没有值的,所以无法成为虚函数,只能作为普通函数。

而类的析构函数最好是虚函数,因为在delete对象时,我们希望删除的是该对象,而不是调用基类的析构函数。

5.纯虚函数与抽象类

C++纯虚函数和抽象类详解 (biancheng.net)

纯虚函数没有函数体,只有声明,后面加=0;如:virtual void showvir()=0;

包含纯虚函数的类是抽象类,无法被实例化,因为纯虚函数没有函数体,没有实现即无法为它分配内存。

继承类必须实现所有基类的纯虚函数才能实例化,否则继续作为抽象类让继承类实现。

另一个作用是多态,因为纯虚函数也是虚函数,基类指针可以访问实例化的继承类。

6.对象的内存模型

C++对象内存模型 - 知乎 (zhihu.com)

图说C++对象模型:对象内存布局详解 - melonstreet - 博客园 (cnblogs.com)

7.c++内存管理

(19条消息) C++内存管理(面试版)_知愚的博客-CSDN博客

8.三种智能指针

(19条消息) C++11 智能指针【详解+实现】【面试常考】_c++ 11 ptr ref_嘿哈哈哈的博客-CSDN博客

【c++面试之智能指针】【万字长文】【超级详细】最详细解析四种智能指针,面试题汇总及解答,妈妈再也不担心面试官考我智能指针了。 - 知乎 (zhihu.com)

9.linux内存管理

 分页内存为基础的虚拟内存机制

linux查看端口:netstat或者lsof

linux查看磁盘占用情况:df -h 和du -sh

10.四次挥手和4次握手

11.rpc

(19条消息) C++微服务RPC框架,一文带你彻底搞懂 RPC_rpc c++_Linux服务器开发的博客-CSDN博客

12.stl

13.排序算法

14.粘包问题

15get和put本质是什么区别

16大小端字节序判别方法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值