20. 浅拷贝与深拷贝

如何理解C++中的浅拷贝与深拷贝

深拷贝和浅拷贝

在进行对象拷贝时,当对象包含对其他资源的引用,如果需要拷贝这个独享所引用的对象,那就是深拷贝,否则就是浅拷贝


21.构造函数和析构函数的调用顺序? 继承时需要注意的问题

构造函数是自上而下调用,析构函数是自下而上调用

顺序

#include<iostream>
using namespace std; class Base{
public:
Base(){cout<<"创建Base基类。"<<endl;}
~Base() {cout<<"删除Base基类。"<<endl;}
};
class Child : public Base{
public:
Child() {cout<<"创建Child派生类。"<<endl;}
~Child() {cout<<"删除Child派生类。"<<endl;}
}; int main()
{
cout<<"*********构造函数调用顺序示例***********"<<endl;
Child *C1 = new Child;
cout<<"*********析构函数调用顺序示例***********"<<endl;
delete C1;
}

基类的构造函数、析构函数不能被派生类继承

C++派生类的构造函数


22. placement new

C++ 标准的 new 表达式能完成大部分的需求, 但不是全部, 比如:
如何在已有的内存空间上创建对象, 标准 new 表达式做不了, C++也不支持直接在raw内存上调用对象的构造函数, 于是placement new就产生了, 取名placement, 也说明了它的历史来源, 即在原地构建一个新对象.


内存池用到placement new

linklink


23. 函数模板和类模板的区别

函数模板与类模板的区别

函数模板既可以隐式调用也可以显式调用,而类模板只能显示调用


24. map与unordered_map区别和联系

  1. map内部实现了一棵红黑树,该结构具有自动排序的功能

红黑树的性质:

  1. 节点是红色或者黑色
  2. 根节点是黑色的
  3. 每个叶节点(NIL节点、空节点)是黑色的
  4. 每个红色节点的两个子节点都是黑色的(从每个叶子到根的所有路径上不能有两个连续的红色节点)
  5. 任一一个节点到每个叶子的所有路径都包含相同数目的黑色节点

    关键性质:从根到叶子最长的可能路径不多于最短可能路径的两倍长,平衡的

红黑树的每一个节点都代表着map的一个元素。因此对map查找、添加、删除等一系列操作

所以红黑树的效率决定了map的效率

优点:效率高,很多操作在O(lgn)下就能完成;而且具有有序性

缺点:空间占用率高

  1. unordered_map内部实现了一个hash表,所以其中的元素是乱序的

    优点:查找速度非常快

    缺点:hash表建立的时间比较长

25. new/delete malloc/free区别

https://www.jianshu.com/p/bda7e83591ff

  1. 操作对象有所不同

    malloc是函数 new是关键字

    new动态

malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free。

1、new自动计算需要分配的空间,而malloc需要手工计算字节数

2、new是类型安全的,而malloc不是,比如:

int* p = new float[2]; // 编译时指出错误

int* p = malloc(2*sizeof(float)); // 编译时无法指出错误

new operator 由两步构成,分别是 operator new 和 construct

3、operator new对应于malloc,但operator new可以重载,可以自定义内存分配策略,甚至不做内存分配,甚至分配到非内存设备上。而malloc无能为力

4、new将调用constructor,而malloc不能;delete将调用destructor,而free不能。

5、malloc/free要库文件支持,new/delete则不要。

  1. 用法上也有所不同

26 函数中的可变参数是如何实现的?为什么参数要从右到左压栈

https://blog.csdn.net/jackystudio/article/details/17523523

  • 可变参数的函数是指函数的参数个数可变,参数类型不定的函数
  • 函数的调用参数会进行压栈处理,参数与参数之间的存放是连续的,也就是说,只要知道了第一个参数的地址和类型,以及其他参数的类型,就可以获得各个参数的地址
  • int call(const char* format, a,b)
  • 如果从左到右压栈,第一个参数(即描述可变参数的那个参数)被压在栈底,很不方便

27. 堆和栈的区别

预备知识:一个C/C++编译的程序占用的内存分为几个部分

(1) 栈:由编译器自动分配释放,存放函数的参数值,局部变量的值

(2) 堆:由程序员分配,若程序员不释放可能由操作系统回收,链表

(3) 全局区(静态区):全局初始化区与全局weight初始化区

(4) 文字常量区:常量字符串

(5) 程序代码区:存放二进制代码

区别:

(1) 栈是编译器自动分配释放的,堆是程序员自己分配释放的

(2) 栈的栈顶地址与容量是系统默认设定好的,为2M,若申请的空间大于剩余的空间,则overflow,是连续的;栈向低地址生长;

堆是不连续的。堆的空间比较灵活,比较大;堆向高地址生长。

(3) 栈速度较快,堆速度较慢

(4) 在函数调用中,第一个进栈的函数调用语句的下一条可执行语句的地址--->函数的各个参数,由右向左--->函数中的局部变量

堆:堆的头部用一个字节存放堆的大小,堆中的具体内容由程序员安排


28. 模版有什么作用,它的好处是什么?什么时候适合用模版

模板是泛型编程的基础,泛型编程即一种独立于特定类型的方式编写代码

好处:(1) 可以实现多态 (2) 代码重用

多个函数或类有着共同的操作,但是数据类型不同

类是对象的抽象,对象是类的实例;类模板是对类的抽象,类是类模板的实例


29. 回调函数有什么用,举个例子? lambda如何实现函数回调?

回调函数:通过函数指针调用的函数

把A函数的指针当作参数传给B函数,然后在B函数中通过那个指针调用A函数,A函数就是回调函数

函数指针:存储的是一个函数的地址

MFC中的定时器 SetTimer

https://blog.csdn.net/SweetTool/article/details/72811638

(1) 首先定义回调函数

(2) lambda实现回调接口并调用


30.如何避免内存泄漏

内存泄漏:由于疏忽或者错误造成程序未能释放已经不再使用的内存的情况

http://qiusuoge.com/9820.html

https://juejin.im/entry/5808731d570c350068d5c07a

  • 内存管理关键字与函数 new/delete malloc/free

  • 代码逻辑

  • 多线程

  • 智能指针


31. 设计模式?单例模式?如何实现?哪一种是线程安全的?

https://www.cnblogs.com/chengjundu/p/8473564.html

http://www.runoob.com/design-pattern/singleton-pattern.html

设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方法

单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点


(1) 懒汉式:第一次用到类实例的时候才会去类实例化

(2) 饿汉式:在单例模式定义的时候就进行初始化

实现线程安全:懒汉式加锁,饿汉式


32.C++ 11有什么新特性?

https://my.oschina.net/wangxuanyihaha/blog/183151

  • (1) auto:自动类型推导
  • (2) decltype:从一个变量或者表达式中得到类型
  • (3) nullptr
  • (4) 序列for循环 跟python有点像
  • (5) lambda 创建并定义匿名的函数对象,以简化编程工作
  • (6) 变长参数模板,新的数据类型tuple 跟Python有点像
  • (7) 列表初始化
  • (8) 多线程支持

33. QT信号和槽机制的优点?

Qt 信号和槽机制优点效率的详解

Qt 提供了信号和槽机制用于完成界面操作的响应,是完成任意两个Qt对象之间的通信机制。

其中,信号会在某个特定情况或动作下被触发槽是等同于接收并处理信号的函****数

优点:

1、类型安全。需要关联的信号和槽的签名必须是等同。

即信号的参数类型和参数个数 同接收该信号的槽的参数类型和参数个数相同。

2、松散耦合。信号和槽机制减弱了 Qt 对象的耦合度。

激发信号的 Qt 对象无须知道是哪个对象的哪个槽需要接收它发出的信号,它只需要做的是在适当的时间发送适当的信号就可以了,而不需要知道也不关心它的信号有没有被接收到,更不需要知道哪个对象的哪个槽接收到了信号。

同样地,对象的槽也不知道是哪些信号关联了自己,而一旦关联信号和槽,Qt 就保证了适合的槽得到了调用。即使关联的对象在运行时被删除。应用程序也不会崩溃。

效率:

信号和槽机制增强了对象间通信的灵活性,然而这也损失了一些性能。同回调函数相比,信号和槽机制运行速度有些慢。通常,通过传递一个信号来调用槽函数将会比直接调用直接调用非虚函数运行速度慢 10 倍。原因如下。

  • 1)需要定位接收信号的对象。
  • 2)安全地遍历所有的关联。
  • 3)编组 / 解组传递的参数。
  • 4)多线程的时候。信号可能需要排队等待。

C++面试笔记(3)的更多相关文章

  1. Java高级开发工程师面试笔记

    最近在复习面试相关的知识点,然后做笔记,后期(大概在2018.02.01)会分享给大家,尽自己最大的努力做到最好,还希望到时候大家能给予建议和补充 ----------------2018.03.05 ...

  2. php面试笔记(5)-php基础知识-自定义函数及内部函数考点

    本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 在面试中,考官往往喜欢基础扎实的面试者,而函数相关的考点 ...

  3. php面试笔记(3)-php基础知识-运算符

    本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 在面试中,考官往往喜欢基础扎实的面试者,而运算符相关的考 ...

  4. php面试笔记(2)-php基础知识-常量和数据类型

    本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 面试是每一个PHP初学者到PHP程序员必不可少的一步,冷 ...

  5. GitHub标星125k!阿里技术官用3个月总结出的24万字Java面试笔记

    最近收到一位粉丝的回馈! 这位粉丝已经成功入职阿里了小编很是羡慕啊! 今天就把这份30w字Java面试笔记给大家分享出来,说来也巧这份资料也是由一位阿里技术官整理出来的这算不算是"搬起石头砸 ...

  6. 手游2dx面试笔记一

    第一轮IQ测试:都来面试程序了,相信IQ再怎么也坑不到哪里去吧.要问什么样的题,几页纸呐, 如:1.找出不同类:羚羊.斑马.鲨鱼 2.在()里添一字使2边都能组词:木()料 3.中间值?:1,2,4, ...

  7. <转载> C++笔试、面试笔记

    这些东西有点烦,有点无聊.如果要去C++面试就看看吧.几年前网上搜索的.刚才看到,就整理一下,里面有些被我改了,感觉之前说的不对或不完善. 1.求下面函数的返回值( 微软) int func(x)  ...

  8. C++面试笔记--树

    树 树的题目基本都是二叉树,但是面试官还没有说是不是二叉树的时候千万不要先把答案说出来,要是面试官说是多叉树,而你做的是二叉树就直接挂了! 一. 树的三种遍历.前序.中序.后序,如果直接考遍历,就肯定 ...

  9. C++面试笔记--继承和接口

    整个C++程序设计全面围绕面向对象的方式进行.类的继承特性是C++的一个非常重要的机制.继承特性可以使一个新类获得其父类的操作和数据结构,程序员只需在新类中增加原有类没有的成分. 在面试过程中,各大企 ...

  10. C++面试笔记--指针和引用

    面试一:指针与引用的区别? 答案: (1)非空区别.在任何情况下都不能使用指向空值的引用.因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针 ...

随机推荐

  1. Kotlin 继承

    Kotlin 中所有类都继承该 Any 类,它是所有类的超类,对于没有超类型声明的类是默认超类: class Example // 从 Any 隐式继承 Any 默认提供了三个函数: equals() ...

  2. leecode第二百三十一题(2的幂)

    class Solution { public: bool isPowerOfTwo(int n) { bool is_flag=false; ) { ==)//如果为1,看是不是第一个1 { if( ...

  3. postman(十一):添加cookie

    有些接口在调用时,需要提供权限,如下 这个时候可以通过添加cookie的方式跳过验证 为了更方便地获取cookie等信息,可以在chrome中安装一个插件:Postman Interceptor,配合 ...

  4. Linux 细节(杂)

    1.所有上传至linux服务器的文件都是英文,避免中文出现乱码导致一些非预期错误,难以查找. 2.删除较危险,linux没有回收站,慎用 rm -rf 3.vi/vim学习地址:http://www. ...

  5. pyhton课堂随笔-基本画图

    %matplotlib inline import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np impor ...

  6. 最简单的RPC框架实现

    通过java原生的序列化,Socket通信,动态代理和反射机制,实现一个简单的RPC框架,由三部分组成: 1.服务提供者,运行再服务端,负责提供服务接口定义和服务实现类 2.服务发布者,运行再RPC服 ...

  7. python----数据驱动@ddt.file_data结合yaml文件的使用

    一.创建yaml文件1. 安装yaml模块 pip install pyyaml2. 新建yaml文件 右键任意文件夹-->New-->File,输入文件名并以.yaml或.yml结尾 二 ...

  8. Rhel6.6---执行命令df -h卡住不动

    问题描述 nfs服务宕掉后,df -h卡住不动,使用xftp也无法打开文档路径 -bash-4.1# mount /dev/mapper/vg_root-LogVol00 on / type ext4 ...

  9. Fortran与C/C++混合编程示例

    以下例子均来自网络,只是稍作了编辑,方便今后查阅. 子目录 (一) Fortran调用C语言 (二) C语言调用Fortran (三) C++ 调用Fortran (四) Fortran 调用 C++ ...

  10. 软件151 王楚博 struts

    一.下载Struts 建立web项目,给项目添加外部引用包(project-properties-Java Build Path-Add External Jars...).添加的包有:commons ...