C++基础

C++基础

简介

内存分配

构造析构

  • 默认函数(Defaulted 函数)
1
2
3
4
5
6
Object() {}                          //默认构造函数
~Object() {}                         //析构函数
Object(const Object&) {}             //复制构造函数
Object(Object&&) {}                  //移动构造函数
Object& operator=(const Object&) {}    //赋值函数
Object& operator=(Object&&) {}        //移动赋值函数
  • 构造函数执行顺序
  • 析构函数执行顺序

初始化

  • 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
  struct A {
    int a;
    int b;
    A(int a, int b) a(a),b(b) {};
  }

A a1 = {1, 2};        //1. 顺序初始化
A a2 = {.b=1, .a=2};  //2. c99,点+=
A a3 = {b:1, a:2};    //3. gcc,
A a4(1,2);            //4. 构造函数方式构造, 在函数栈上分配,函数结束后,自动调用析构函数释放;

A *a5 = new A(1,2);    //5. 在堆上分配A结构体,将结构体堆内存指针返回给a5,不会自动释放;

T global;        //T是我们的自定义类型,因为它是全局变量,所以首先零初始化,实际上进行的是默认初始化

void foo()
{
    T i;         //默认初始化
    T j{};       //值初始化(C++11)
    T k = T();   //值初始化
    T l = T{};   //值初始化(C++11)
    T m();       //函数声明

    new T;       //默认初始化
    new T();     //值初始化
    new T{};     //值初始化(C++11)
}

struct A
{
    T t;
    A() : t()    //t将值初始化
    {
        //构造函数
    }
};

struct B
{
    T t;
    B() : t{}    //t将值初始化(C++11)
    {
        //构造函数
    }
};

struct C
{
    T t;
    C()          //t将默认初始化
    {
        //构造函数
    }
};

全局默认操作符函数

  • operator ,
  • operator &
  • operator &&
  • operator .
  • operator ->
  • operator *
  • operator new
  • operator delete

虚函数

1
2
3
4
class A {
  virtual void func1() {}   //普通虚函数
  virtual void func2() = 0;   //纯虚函数,子类必须实现基类的纯虚函数。
}
  • 虚函数表
  • 纯虚函数
    • 纯虚函数是在基类中声明的虚函数,它在基类中没有定义
    • 任何派生类都要定义自己的实现方法。
    • 在基类中实现纯虚函数的方法是在函数原型后加“=0”
  • 抽象类
    • 含有纯虚函数的类称为抽象类,
    • 抽象类不能实例化;

继承

1
2
class base {}
class son:base{}
  1. 重载,隐藏,覆盖
  2. 多重继承

左值右值

  • 左值(l-value): 表达式结束后仍存在的值,可以使用&取地址
  • 右值(r-value):表达式结束后不存在的值,不可用&取地址

移动语义

1
move() //操作符

decltype

  • explicit:用于防止由构造函数定义的隐式转换,只能用在类内部的构造函数声明上,而不能用在类外部的函数定义上。

存储周期

  • automatic
  • static
  • dynamic
  • thread

ABA

参考

  1. [C++]五花八门的C++初始化规则
updatedupdated2024-05-102024-05-10