C++后端开发知识点总结

C++后端开发知识点总结

C++后端开发知识点总结

C++

1. 全局变量的作用域与初始化

全局变量作用于是从声明开始到整个文件结束,初始化可以在声明时直接初始化。

2. 字节对齐的计算方法

首先你要知道为什么会出现字节对齐,这是一种用空间换时间的做法,因为对齐之后可以提高取数的效率。结构体的大小一般是4或者8的倍数,具体是以最大的变量类型的大小为基数的。也就是说在内存中,数据一般是放在一个4的整数倍的起始地址。
首先看结构体中哪一个变量所占的字节数最大,然后后面的对齐计算都以这个为基数(我这里以4字节为例)。接着,你把每一个成员变量的大小依次相加(按照结构体定义中的顺序,从第一个加到最后一个)。当你加到某一个变量的时候,发现超过了4个字节,那么就把这个变量之前的内容当作是一个整体,它们一共点4个字节,后面的再继续这个过程
例子
参考

3. 类的静态成员

静态成员的功能

  • 静态成员变量属于整个类所有,所有对象共享类的静态成员变量
  • 静态成员变量的生命周期不依赖于任何对象
    可以通过类名和对象名访问public静态成员变量

静态成员变量的定义

  • 静态成员变量在类的内部声明,声明时直接通过static关键字修饰
  • 静态成员变量在类的外部定义与初始化,语法规则为Type ClassName::VarName = value;
  • 静态成员变量不占用类的大小,而是在类外(全局数据区)单独分配空间
    参考

4. 纯虚函数的用法

  • 虚函数和纯虚函数可以定义在同一个类(class),含有纯虚函数的类被称为抽象类(abstract class)。
  • 虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用 。
  • 纯虚函数在抽象类中只有声明而没有定义。
  • 虚函数和纯虚函数都可以在子类(sub class)中被重载,以多态的形式被调用。
  • 虚函数和纯虚函数通常存在于抽象基类(abstract base class -ABC)之中,被继承的子类重载,目的是提供一个统一的接口。
  • 虚函数的定义形式:virtual type function();
  • 纯虚函数的定义形式:virtual type function() = 0;
  • 在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定。
  • 如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类(ABC)是不能被直接调用的。必须被子类实现。
    参考

5. 构造函数和析构函数的执行顺序

  • 构造函数的调用顺序
    基类构造函数、对象成员构造函数、派生类本身的构造函数
  • 析构函数的调用顺序
    派生类本身的析构函数、对象成员析构函数、基类析构函数(与构造顺序正好相反)
  • 特例
    局部对象,在退出程序块时析构
    静态对象,在定义所在文件结束时析构
    全局对象,在程序结束时析构
    继承对象,先析构派生类,再析构父类
    对象成员,先析构类对象,再析构对象成员
    参考

6. 类的作用域

  • 每个类都会定义自己的作用域,在类的作用域之外,普通数据和函数只能由对象、引用、指针或者成员访问符来访问。
  • 一个类就是一个作用域的事实很好地解释了为什么类外定义成员函数时必须提供类名和函数名。在类的外部,成员的名字被隐藏起来了。
  • 一旦遇到类名,定义的剩余部分就在类的作用域之内,这里的剩余部分包含参数列表和函数体,结果就是可以直接使用类的其它成员而无须再次授权了。
    参考

7. STL相关数据结构的基本用法

  • vector,向量,动态数组。push_back向后插入一个元素。pop_back弹出最后一个元素。
  • array,定长数组,使用迭代器,可以使用算法库的算法。
  • deque,双端队列。
  • forward_list,单向链表。
  • list,双向链表。
  • queue,队列,先进先出。
  • stack,栈,先进后出。
  • map,不可重复,快速查找(底层红黑树),key和value对应。
  • set,不可重复,排序,快速查找(底层红黑树),key和value对应。
  • unordered_map,和map相同,底层使用hash查找,使用链表解决冲突。
  • unordered_set,和set相同,底层使用hash查找,使用链表解决冲突。

8. 文件的读写操作

  • fstream类。
    void open(const char* filename,int mode,int access);
    << 输出(写入),>> 输入(读出)。
  • istream类。只写。声明时初始化路径。
  • ostream类。只读。声明时初始化路径。
    参考

9. 内联函数

内联函数与一般函数的区别

  • 内联含函数比一般函数在前面多一个inline修饰符
  • 内联函数是直接复制“镶嵌”到主函数中去的,就是将内联函数的代码直接放在内联函数的位置上,这与一般函数不同,主函数在调用一般函数的时候,是指令跳转到被调用函数的入口地址,执行完被调用函数后,指令再跳转回主函数上继续执行后面的代码;而由于内联函数是将函数的代码直接放在了函数的位置上,所以没有指令跳转,指令按顺序执行
  • 一般函数的代码段只有一份,放在内存中的某个位置上,当程序调用它是,指令就跳转过来;当下一次程序调用它是,指令又跳转过来;而内联函数是程序中调用几次内联函数,内联函数的代码就会复制几份放在对应的位置上
  • 内联函数一般在头文件中定义,而一般函数在头文件中声明,在cpp中定义
    参考

10. 修改指针和修改指针指向的数据

  • 修改指针,将指针指向的地址修改为另一个地址,即将指针指向另一个数据。
  • 修改指针指向的数据,指针指向的地址不发生改变,指针指向地址的数据发生改变,修改为新的数据。

11. void指针类型

  • 指针有两个属性:指向变量/对象的地址和长度。但是指针只存储地址,长度则取决于指针的类型。编译器根据指针的类型从指针指向的地址向后寻址。指针类型不同则寻址范围也不同
  • void指针是一种没有类型的指针,不能判断出指向对象的长度。
  • 任何指针都可以赋值给void指针,不需要转换,只获得对象地址而不获得大小。
  • void指针赋值给其他类型的指针时都要进行转换,告诉类型对象大小。
  • void指针不能复引用,因为不知道大小,所以不能正确引用。
  • void指针不能参与指针运算,除非进行转换。不能地址偏移。
    参考

数据结构

1. 二分查找

有序数组中(默认升序),每次查找区间中间节点,小于则将改点变为右封闭节点,大于则将改点右边设置为下次查找区间。
参考

2. 简单位运算

  • &,按位与,两者都为真,则真。
  • |,按位或,有真,则真。
  • ^,按位异或,不同则为真。
  • ~,按位取反。
  • <<,左移。
  • >>,右移。

3. 图论算法(dijkstra算法、最小生成树、最短路径)

贪心算法

  • Prim算法:每次选取顶点中权值最小的点(从已选取的节点到该节点的距离,取最小值),然后根据选取节点更新其它节点的距离,取最小值。可得到最小生成树。
  • Kruskal算法:每次选取所有未选取边中最小的边(排除让已选取的边产生环路的边)。
  • dijkstra算法:每次选取顶点中的路径最小的点,然后根据选取节点更新其它节点路径。记录的是路径总长度。可得到最小生成树。

动态规划

  • Floyd算法:将每一个节点都当作一次中间节点,然后计算其它节点通过该节点到另一个节点的距离能不能减少,如果能减少则将改点作为两点之间的中间点。可以得到所有点之间的最短路径。

4. 堆(大顶堆、小顶堆)的构建与使用,如topK场景

  • 树的形状——这棵二叉树是基本完备(完全二叉树),树的每一层都是满的,除了最后一层最右边的元素有可能缺位。
  • 父母优势——每一个节点的键都要大于或等于它子女的键,叶节点除外。

堆的构建

  • 自底向上的构建方法,从最后一个元素开始(最下层,总个数为单数则最后一个元素为右节点,否则为左节点),将其父节点和父节点的左右子节点进行比较,依照堆的特性(大顶堆选最大的元素,小顶堆选最小的元素)选取值进行交换作为父节点。

堆的使用

  • 取出顶上的元素,将顶上的元素与最后一个元素进行交换。然后依照性质(大顶堆、小顶堆)将顶置位父节点,进行调整,如果没产生交换则任务结束,产生交换则将被交换的子节点置位父节点继续循环,直到父节点为叶节点为止(没有左子节点)。

topK场景</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殇弑天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值