Hello World

行走即是圆梦,回望亦是前行。

0%

c++相关知识点

前言

这里简单记录下c++相关知识点总结

C++相关

  • 继承和组合,应用场景
  • 菱形继承,画出内存布局《深度探索C++对象模型》,虚继承解决菱形继承的二义性 博客地址
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include <iostream>

    class A {
    public:
    A(int a) :_ma(a) {}
    public:
    int _ma;
    };
    class B :public A {
    public:
    B(int b) :A(b), _mb(b) {};
    public:
    int _mb;
    };
    class C :public A {
    public:
    C(int c) :A(c), _mc(c) {};
    public:
    int _mc;
    };
    class DTest :public B, public C {
    public:
    DTest(int d) :B(d), C(d), _md(d) {};
    public:
    int _md;
    };

    int main() {
    return 0;
    }

    cl.exe工具查看内存布局,打开vs的命令行工具,在代码目录下执行
    cl [filename].cpp /d1reportSingleClassLayout[classname] filename为文件名;classname为查看的class类名
    如:cl main.cpp /d1reportSingleClassLayoutD;如果输出结果有些库中的信息,尝试去掉头文件<iostream>

  • 只能在堆或只能在栈上分配类对象 博客地址

    只能在堆上分配类对象,将类的析构函数设为私有,编译器无法调用析构函数释放内存,则无法在栈上建立内存
    只能在栈上分配类对象,operator new()设为私有,即可禁止对象被new在堆上

  • 常见排序算法
    类别排序方法平均情况最好情况最坏情况辅助空间稳定性
    插入排序直接插入O($n^2$)O($n$)O($n^2$)O($1$)稳定
    插入排序希尔排序O($n^{1.3}$)O($n$)O($n^2$)O($1$)不稳定
    选择排序选择排序O($n^2$)O($n^2$)O($n^2$)O($1$)不稳定
    选择排序堆排序O($n*\log_2{n})$)O($n*\log_2{n}$)O($n*\log_2{n}$)O($1$)不稳定
    交换排序冒泡排序O($n^2$)O($n$)O($n^2$)O($1$)稳定
    交换排序快速排序O($n*\log_2{n}$)O($n*\log_2{n}$)O($n^2$)O($\log_2{n}$)不稳定
    归并排序归并排序O($n*\log_2{n}$)O($n*\log_2{n}$)O($n*\log_2{n}$)O($n$)稳定
    基数排序基数排序O($d*(r+n)$)O($d*(r+n)$)O($d*(r+n)$)O($r+n$)稳定

    注:基数排序的复杂度中,r代表关键字的基数,d代表长度,n代表关键字的个数
    https://www.runoob.com/w3cnote/ten-sorting-algorithm.html

  • c++关键字

    https://www.runoob.com/w3cnote/cpp-keyword-intro.html

智能指针

作用:使用对象关闭内存,避免手动new和delete
头文件:memory
auto_ptr由c++98提供,已被c++11抛弃

  • auto_ptr
  • unique_ptr
  • shared_ptr
  • weak_ptr

c++对象模型

数据结构链表

面向对象

  • 三大特点

    封装
    继承
    多态

  • 五大基本原则

    单一职责原则(SRP)
    开放封闭原则(OCP)
    里氏替换原则(LSP)
    依赖倒置原则(DIP)
    接口隔离原则(ISP)

四种强制类型转换

  • const_cast

    修改类型的const或volatile属性,去除常量性的对象必须是指针或引用

  • static_cast

    类似c语言的强制类型转换,用于c++内置基本数据类型的转换,类指针或引用上行转换是安全的,下行转换没有动态类型检查,是不安全的
    c++ primer中说道:c++的任何的隐式转换都是使用static_cast来实现

  • dynamic_cast

    动态(面向对象的多态和程序运行时的状态)类型转换,不能用于内置数据类型转换,转换时基类一定含有虚函数,否则会编译报错
    上行转换时效果和static_cast一样,下行转换时具备类型检查,转换失败抛出异常,比static_cast更安全

  • reinterpret_cast

    主要用途:1. 改变指针或引用的类型;2. 将指针或引用转换为一个足够长度的整形;3. 将整型转换为指针或引用类型
    reinterpret_cast(expression) type-id 必须是一个指针、引用、算术类型、函数针或者成员指针。
    它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针)
    请谨慎使用 reinterpret_cast

sizeof 空类+构造,虚析构函数,父类仅有方法+子类一个int变量

环境:windows10 + vs2019

空类+构造,sizeof=1 ==> sizeof(class)
虚析构函数,sizeof=4 ==> sizeof(void*)
父类仅有方法+子类一个int变量,sizeof=4 ==> sizeof(int)

模板多态和虚多态

c++11