C++知识点

C++编译原理
    Preprocessing + Compilation + Assembly + Linking
    -E 预编译 生成.i文件
    -S 预编译+编译 生成.s文件
    -c 预编译+编译+汇编 生成.o文件
    -l
    -g 生成调试时间
    -W 使能警告
    符号表
    头文件的例外:
        const全局变量
        static变量
        inline
        class类内定义
    https://zybuluo.com/uuprince/note/81709


多态三要素
    父类中有虚函数。
    子类覆盖父类中的虚函数
    通过己被子类对象赋值的父类指针,调用该虚函数
    作用:
        隐藏实现细节
        接口重用


虚函数与多态
    虚函数的特性:动态绑定(只能由引用或指针触发)
    多态:
        1. 引用或指针的静态类型与动态类型不一致
        2. 由动态类型决定真实执行的版本
    override与final
        override 标记此函数覆盖了基类的虚函数(避免发生隐藏),也只有虚函数可以覆盖
        final 标记子类不可以覆盖此虚函数
    默认实参:使用引用或指针的静态类型,而不是动态类型
    绕过动态绑定:使用作用域运算符
    不能设为虚函数的有:
        1. 构造函数(参见多态)
        2. inline成员函数(不存在函数调用)
        3. static成员函数(没必要)
        4. 友元函数(没有继承的概念)


虚函数表
    每个父类(有虚函数)维持一个表
    https://blog.csdn.net/haoel/article/details/1948051


菱形继承:虚继承解决,共同父类导致的二义性问题


三/五法则
    如果一个类需要析构函数,那么也需要拷贝构造函数和拷贝赋值构造函数。
    如: 析构函数中需要释放一个构造函数中分配的动态内存,默认的拷贝会使得所有对象都指向同一个动态内存。


内存泄露
    definitely lost:
        1. 多态中,父类的析构函数不是虚函数
        2. 智能指针,循环引用(weak解锁)
        3. 内存覆盖,strncpy
    indirectly lost:
        1. longjmp
    possibly lost:
        1. 由于抛出异常导致没有释放内存


(char *) 0 、(char *) 9 :
    (char *) 0:C语言中,produce a null-pointer value of type char *;其他语言可能执行其他地址
    (char *) 9:大多数语言中执行地址9


宏定义的作用域: 
    C语言标准中宏定义的作用域是--从定义位置开始,到其当前所在作用域结束,即宏定义只属于当前这个文件,其他文件如果没有通过#include包含这个文件,那就不能使用这个宏定义。


内存屏障:
    保证屏障前后的执行顺序
    http://www.cnblogs.com/Mainz/p/3556430.html


volatile:
    volatile 作用:
        1. 不允许被优化消失,必须按部就班地与「内存」进行交互
        2. 于序列上在另一个对 volatile 对象的访问之前
    volatile 只在三种场合下是合适的:
        1. 和信号处理(signal handler)相关的场合
        2. 和内存映射硬件(memory mapped hardware)相关的场合
        3. 和非本地跳转(setjmp 和 longjmp)相关的场合
    https://liam0205.me/2018/01/18/volatile-in-C-and-Cpp/


SegmentFault:
    enable: ulimit -c unlimited
    save path: /cores/


hash与map
    map有两种实现方式:hash和二叉树
    stl的map是红黑树;unordered_map是hash


智能指针
    默认初始化为空指针
    可以制定删除器
    unique_ptr不能拷贝或赋值,但将要被销毁的指针除外
    unique_ptr可以通过release或reset转移指针所有权
    删除器导致shared_ptr和unique_ptr的区别:
        shared_ptr的删除器指针是运行时绑定;
        unique_ptr的删除器指针是编译时绑定;
    shared_ptr与control block
        1. 对象指针
        2. 引用计数
        3. 删除器
        支持原子访问
        weak_ptr也会保持control block不被释放
    https://heleifz.github.io/14696398760857.html


仿函数
    不是函数,但可以像函数一样调用对象(重载了operator())


引用与指针
    语言层面上,引用不是指针,只是变量的别名
    从底层实现上,引用是指针实现的



refs:
    Makefile             https://seisman.github.io/how-to-write-makefile/introduction.html        

猜你喜欢

转载自www.cnblogs.com/shaellancelot/p/9021906.html