![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++面试题记录
文章平均质量分 50
基础知识
fantongl
这个作者很懒,什么都没留下…
展开
-
13_构造函数和析构函数的调用时机
1. 拷贝构造函数的调用时机 用类的一个对象去初始化另一个对象时 当函数的形参是类的对象时(也就是值传递时),如果是引用传递则不会调用 当函数的返回值是类的对象或者引用时。原创 2021-09-06 19:46:59 · 216 阅读 · 0 评论 -
右值引用
右值和左值、 左值:在C++11中可以取地址的,有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值) 右值引用和左值引用 左值引用就是对一个左值进行引用的类型。右值引用就是对一个右值进行引用的类型,事实上,由于右值通常不具有名字,我们也只能通过引用的方式找到他的存在。 我们可以将一个右值引用绑定到表达式,自勉之常量或者返回右值的表达式,但是不能将右值引用绑定到左值上。 右值引用指向将要被销毁的对象 变量是左值,因此我们不能把右值引用直接绑定到变量上 我们可以销毁一个移后源对象,也可以原创 2021-09-06 16:32:10 · 226 阅读 · 0 评论 -
一个C++源文件从文本到可执行文件经历的过程
一个C++源文件从文本到可执行文件经历的过程 0. 步骤 预处理、编译、汇编、链接 1. 预处理 首先是源代码文件helloworld.cpp和相关头文件预处理成一个.i文件,预处理的过程主要是处理那些源代码文件中只能以“#”开始的预处理命令。 g++ -E helloworld.cpp -o helloworld.i 1.1. 预处理主要规则如下: 将#define删除,并将宏定义展开 处理一些条件预编译指令,如#ifndef,#ifdef,#elif,#endif等,将不必要的代码过滤掉。 处理#i转载 2021-08-31 15:05:50 · 256 阅读 · 0 评论 -
C++四种类型转换
C++四种类型转换1. 隐式类型转换2. 显式类型转换2.1 static_cast2.2. dynamic_cast2.3. const_cast2.4. reinterpret_cast C++的四种强制类型转换,分别为static_cast、dynamic_cast、const_cast、reinterpret_cast C++风格的强制类型转换的好处是,能够更清晰的表明他们要干什么。 1. 隐式类型转换 大多数表达式中,比int类型小的整型数值首先提升为较大的整数类型 在条件中,非布尔值转换为布转载 2021-08-28 19:46:24 · 127 阅读 · 0 评论 -
12_智能指针
智能指针 0. 普通指针存在的问题 0.1 悬垂指针 当有多个指针指向同一个基础对象时,如果某个指针delete了该基础对象,对这个指针来说它是明确了它所指的对象被释放掉了,所以她不会再对所指对象进行操作,但是对于剩下的其他指针来说并不清楚所指对象已被删除。 1. 为什么会有智能指针 C++程序员需要自己善后自己动态开辟的内存,一旦忘记释放,内存就泄露。 智能指针可以帮助程序员自动释放自己开辟的内存 智能指针将基本类型指针封装为类对象指针,并在析构函数里编写delete语句删除指针指向的内存空间。 2. 智原创 2021-08-23 16:41:30 · 135 阅读 · 0 评论 -
11_哈希表
哈希表1. 冲突解决方案2. 哈希表的查找时间复杂度 1. 冲突解决方案 线性探查:该元素的哈希值对应的桶不能存放元素时,循序往后一一查找,直到找到一个空桶为止,在查找时也一样。 二次探查:该元素的哈希值不能存放元素时,就往后寻找1^2, 2^2个位置 双散列函数法:当第一个散列函数发生冲突时,使用第二个散列函数进行哈希,作为步长 开链法:在每一个桶中维护一个链表,由元素哈希值寻找到这个桶,然后将元素插入到对应的链表中,‘ 建立公共溢出区,当发生冲突时,将所有冲突的数据放在公共溢出区。 2. 哈希表的查原创 2021-08-23 11:38:47 · 67 阅读 · 0 评论 -
10_树的问题
二叉查找树 1. 特征 左子树上所有节点的值均小于或等于他的根节点的值 右子树上所有节点的值均大于或等于他的根节点的值 左右子树也分别为二叉排序树 二叉平衡树(AVL树) 1. 介绍 AVL树是带有平衡条件的二叉查找树,一般是用平衡因子差值判断是否平衡并通过旋转来实现平衡,左右子树树高不超过1,和红黑树相比,AVL数是严格的平衡二叉树, 2. 局限性 由于维护这种高度平衡(即所有节点的左右子树高度差绝对值不超过1),不管是执行插入还是删除操作,只要不满足平衡条件,就必须通过旋转来保持平衡,而旋转是非常原创 2021-08-23 11:25:26 · 84 阅读 · 0 评论 -
09_memcpy的实现
memcpy的实现 简单版本 /** * @description: * @param {void*} src 原串指针 * @param {void*} dest 目的串指针 * @param {int} len 长度 * @return {*} */ void* memcpy(void* src, void* dest, int len) { // 不在函数内申请空间,所以需要进行判断 if(dest == NULL || src == NULL ) {转载 2021-08-19 10:52:33 · 55 阅读 · 0 评论 -
Nginx问题汇总
Nginx问题汇总(1) 什么是Nginx(2) 为什么用Nginx(3) Nginx的性能为什么这么高(4)Nginx如何处理高并发请求(5) 什么是反向代理和正向代理(6) 什么是负载均衡(7) Nginx限流算法(8) 说明三种限流算法(9) 漏桶流算法和令牌桶算法(9.1) 漏桶流算法(9.2) 令牌桶算法(10) Nginx的负载均衡算法怎么实现的,策略有哪些(11) Nginx的惊群问题(11.1) 惊群问题的产生(11.2) 如何解决惊群问题(11.3) 原理参考链接: (1) 什么是Ngi转载 2021-08-10 18:21:48 · 167 阅读 · 0 评论 -
同步和异步、阻塞和非阻塞
同步和异步、阻塞和非阻塞 (1) 同步和异步 同步和异步关注的是消息通信机制 同步,是指在发出一个调用时,在没有得到结果之前,该调用就不返回 异步,是指在发出一个调用之后,这个调用就直接返回了,所以没有携带调用结果 (2) 阻塞和非阻塞 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态. 阻塞:指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回 非阻塞:调用不能立刻得到结果之前,该调用不会阻塞当前进程。 (3)I/O多路复用 I/O多路复用指的其实是在单个线程通过转载 2021-08-09 17:34:52 · 94 阅读 · 0 评论 -
08_C++虚函数
(1) 面向对象的三大特性 封装:隐藏了类的实现细节和成员数据,实现了代码模块化 继承:使得子类可以复用父类的成员和方法,实现了代码重用 多态:一个接口,多个实现。通过父类调用子类的成员函数,实现了接口重用。 (2) 虚函数实现原理 C++的虚函数是实现多态的机制,他是通过虚函数表实现的,虚汗是是每个类中存放虚函数地址的指针数组,类的实例在调用函数时会在虚函数表中寻找函数地址进行调用,如果子类覆盖了父类的函数,那么子类的虚函数表会指向子类实现的函数地址,否则指向父类的函数地址。 (3) 构造函数为什么一原创 2021-08-03 11:02:21 · 81 阅读 · 0 评论 -
C++进程内存分布
(1)C++进程内存分布 1、内存分布分为五部分,从高地址到低地址依次为:栈、堆、未初始化的数据段(bss)、初始化的数据段、代码段 2、栈地址空间向下、堆地址空间向上 3、代码段(text):存放程序的二进制代码 4、初始化的数据(Data):它包含有程序员初始化的全局变量和静态变量, 5、未初始化的数据段(bss):这个段的数据在程序开始之前由内核初始化为0,包含所有初始化为0和没有显示初始化的全局变量和静态变量 6、堆:堆是动态内存分配通常发生的部分,其地址分配由低到高 7、栈:存放自动变量,以及每原创 2021-07-28 18:27:32 · 997 阅读 · 0 评论 -
14_C++引用
(1)C和C++的区别 1、C是面向过程的语言、C++是面向对象的语言,C++中有“封装、继承、多态”的特性,封装隐藏了实现的细节,是的代码模块化;继承通过子类继承父类的方法和属性,实现了代码重用;多态则是“一个接口、多个实现”,通过子类重写父类的虚函数,实现接口重用 2、C和C++内存管理的方法不一样。C使用了malloc和free,C++除此之外还使用了new/delete 3、C++中还有函数重载和引用等概念,而C没有 (2)指针和引用的区别 1、指针是一个新的变量,指向另一个变量的地址,我们可原创 2021-07-28 17:52:59 · 80 阅读 · 0 评论 -
03_指针知识汇总
1. 64位和32位格数据类型大小 32位编译器(字节) 64位编译器(字节) 备注 取值范围 char 1 1 char* 4 8 因为32位的寻址空间是232,即32bit,所以大小为4字节,64位寻址空间位264,故8字节 int 4 4 -2^31 - 2 ^ 32 - 1 unsigned int 4 4 float 4 4 dobule 4 4 long 4 8 unsigned long 4 8 long long原创 2021-07-28 10:52:57 · 54 阅读 · 0 评论 -
07_Linux命令知识
07_Linux命令知识 1.创建文件夹,(强制) mkdir -p /home/tianyiyi/workspace 2. 查看Linux下句柄相关信息 lsof 2.1 Linux下句柄总数 lsof | wc -l原创 2021-07-27 14:25:20 · 63 阅读 · 0 评论 -
06_内联函数
@TOC(06_内联函数) (1) 内联函数的定义 定义: 当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用. (2) 内联函数的定义 优点: 当函数体比较小的时候, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它函数体比较短, 性能关键的函数, 鼓励使用内联. 缺点: 滥用内联将导致程序变慢. 内联可能使目标代码量或增或减, 这取决于内联函数的大小. 内联非常短小的存取函数通常会减少代码大小, 但内联一个相当大的函数将戏剧性的增加代码大小. 现代处理原创 2021-07-27 11:42:38 · 443 阅读 · 0 评论 -
05_内存对齐
(1)内存对齐 (2)内存对齐原则 结构体变量的起始地址能够被其最宽的成员大小整除 结构体每个成员相对于起始地址的偏移能够被其自身大小整除,如果不能则在前一个成员后面补充字节 结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节 (3) 例子 #include <stdio.h> struct A{ char a; int b; short c; }; int main() { static struct A *a; static s原创 2021-07-26 16:23:45 · 57 阅读 · 0 评论