C++/QT面试题总结

一 C++基础知识点(必会)
1.虚函数/纯虚函数

2.虚析构函数

3.线程池

4.继承(继承是面向对象复用手段,共享共有的东西,实现各自本质不同的东西)

5.C++特性(封装,继承,多态),多态虚函数表

6.堆栈,内存管理的理解、内存对齐

7.指针/引用/深拷贝/浅拷贝/智能指针

8.对象/成员函数/内联函数

9.模板/IO流/异常

10.常用的数据结构(vector,list,map)区别以及底层实现

11.C/C++常用的算法以及线程池,多线程,qt的控件,常用的设计模式(mvp)

12.C/C++设计模式(单例模式/观察者模式)

13.数据结构(单链表/双链表/队列/栈/矩阵/广义表/二叉树/哈夫曼树/位图/图/迪杰特斯拉算法/广度优先搜索)

14.整理和熟悉常用的Linux指令/熟悉Linux环境搭建(vim/makefile/gdb),常用的shell脚本/Linux数据库

15.svn/git的使用

16.对Qt控件的使用(多线程/网络编程)界面绘制

17.熟悉Linux/Windows中API

18.osg(开源三维引擎,采用C++/OpenGL编写,可在Windows/Linux下),OpenGL(开放图形库,用于渲染2D/3D图形的跨语言/平台API)

19.理解Qt底层机制(元对象,信号槽机制)

20.编程习惯(命名规范)

21.程序编译过程理解(编译过程/生成文件过程)

22.工作中比价难忘的问题??出现问题怎么解决??处理中没法推进怎么办??对公司有什么了解?为什么选择我们公司??

**

二 常见面试知识点
**

1.深拷贝和浅拷贝区别

浅拷贝:只是对对象的指针进行拷贝,并没有重新分配空间,表示两指针指向同一空间。

深拷贝:堆对象数据拷贝到重新分配的空间去,两指针指向各自空间地址。

2.智能指针

shared_ptr强智能指针:共享式智能指针,可以多个智能指针指向同一个内存,每次拷贝构造和赋值都会引用计数+1,每次释放一个对象都会引用计数-1,只有当引用计数为0的时候,堆内存资源才会释放。

初始化:1.std::shared_ptr sp1(new int(123))

              2.std::shared_ptr<int> sp2;

                 sp2.reset(new int(123))

              3.std::shared_ptr<int> sp3;

                 sp3 = std::make_shared_ptr<int>(123);


通过智能指针可以解决线程安全问题,多线程可以通过weak_ptr判断对应的对象是不是还存在,从而使用在线程中访问对象方法。

3.模版的优缺点

优点:模版复用了代码,节省了资源,更快迭代开发;增强代码灵活性

缺点:出现模版编译错误时,错误信息非常凌乱,不易定位错误。

4.C++常用数据结构: std::string/std::vector/std::array/std::pair/std::map/std::set

5.C/C++/Qt常用数据结构:

字符串容器:QString追加/删除/查询/替换/字符串转换

顺序表容器: Qlist,QlinkedList,QVector,QStack,QQueue

关联容器:qmultimap多值映射,qhash效率高但不排序,qmap自动排序

6.常见设计模式:创建型模式(抽象工厂模式/单例模式)

单例模式:懒汉模式,饿汉模式区别:懒汉模式开始时候不实例化,饿汉模式开始时候实例化并创建单例对象;饿汉模式是线程安全的,在多线程模式访问时会new多个实例,会导致不安全,但可以通过同步枷锁避免;饿汉模式没有枷锁,因此执行效率会比较高,懒汉模式有锁,效率比饿汉模式差;饿汉模式类一开始就实例化,无论用否都会实例,既浪费空间,懒汉模式则不浪费空间。

7.指针,结构体占用内存空间,结构体默认公有,类默认私有。

8.类中非虚函数在内存中是独立分布的,并且彼此不相邻,他们都远离对象的地址,并且不占用类的大小。

9.常用数据结构不够用时候可以用结构体,枚举,联合体,位段

10.C++中有成员函数和成员变量,成员变量(静态,非静态)成员函数(静态,非静态,虚函数)C++程序内存布局四大区域:全局数据区,代码区,栈区,堆区(程序可自由分配内存)。全局数据区:静态数据,全局数据,常量,代码区:类的成员函数和非成员函数代码存放在代码区,栈区:为运行函数而分配的局部变量,函数参数,返回值和返回地址,堆:自由分配的内存。

11.空的类是会占内存空间的,而且大小是1,相当于占位的作用,C++要求每个实例都有唯一的地址。

12.普通变量:是要占用内存的,需要注意对齐原则,static修饰的静态变量不占内存,编辑器将其放在全局变量区。

13.类内部成员函数:普通函数(不占内存)虚函数是占一个地址大小(虚函数指针)。

14.C++编译系统中数据和函数是分开存放的(函数主要存放在代码区,数据主要存放在栈区,堆区,静态,全局区以及文字常量区),实例不同对象只给数据分配空间,各个对象调用函数都跳转到函数代码区入口执行。

15.类的静态成员变量是属于类的,所有对象公用一份,不计入类内存空间。所以同一个类创建多个对象,数据成员是各用各的,互不相通(静态成员变量是共享的),成员函数是共享的,多个对象共用一份代码,所有函数存放在代码区。

16.多态的产生是因为菱形继承,既菱形继承存在二义性和数据冗余的问题。

17.虚函数和纯虚函数的区别??

18.静态函数为什么不能定义为虚函数??静态函数不能直接调用??

19.不要在构造函数和析构函数里面调用虚函数(因为构造和析构中对象是不完整的,可能会发生未定义的行为)。

20.最好把基类的析构函数声明为虚函数。

21.构造函数一般先构造基类,然后按照继承顺序进行构造(先基类构造函数–>对象成员的构造函数–>派生类本身的构造函数)。

22.析构函数:派生类本身的析构函数–>对象成员的析构函数–>基类的析构函数,既:先构造的后析构,后构造的先析构。构造一个对象首先构造成员变量,再去构造此对象。析构一个对象时首先析构此对象,然后析构成员变量。

23.在虚函数后加一个“=0”,则为纯虚函数,含纯虚函数的类叫做抽象类,抽象类不能实例化对象,纯虚函数在派生类中重新定义以后,派生类才能实例化出对象。

23.vector,list,map区别?

1.vector底层是数组,list是双链表,map是哈希表

2.vector是连续存储的容器,list不是

3.vector支持随机访问,list不支持

4.vector扩容是成倍扩容,list每次插入新节点都会进行内存申请

5.vector随机访问性能好,插入删除性能差

6.list随机访问性能差,插入删除性能好

24.内存泄漏测试和解决办法

概念:分配某段内存后由于失误导致在释放内存之前就失去对该段内存的控制。主要原因:malloc/new后没有对应free/delete

25.Qt的connec第五个参数有5种(自动(默认),直接连接,消息队列连接,阻塞连接,避免重复连接)

26.常用设计模式?

工厂模式,单例模式(懒汉、饿汉),观察者模式

27.单例模式怎么设计保证线程安全?

构造函数私有化(构造,拷贝构造,赋值运算)

提供静态的全局访问变量,提供外部调用访问。

28.类虚函数结构图(个人理解)如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值