20200216

@ShiKaiWi

Plan

60min: CPP

Notes

聚合类

  • 所有成员都是 public
  • 没有定义任何构造函数
  • 没有类内初始值
  • 没有基类(没有父类,不是子类)

基本和 Go 的 struct 很像。

字面值常量类

数据成员都是字面值类型的聚合类是字面值常量类,或者满足一下条件:

  • 成员都是字面值常量,如果不是的话,必须使用其 constexpr 构造函数来进行类内初始化。
  • 至少含有一个 constexpr 的构造函数。
  • 如果成员含有类内初始值,那么这个初始值必须是常量表达式。
  • 析构函数必须使用默认定义。

例子:

class Debug {
public:
    constexpr Debug(bool b = true): io(b) {}
    constexpr bool is_io() const {return io}
    void set_io(bool b) {io = b;}
private:
    bool io;
};

constexpr Debug err(true);
constexpr is_io_err = err.is_io();

引用

  • 引用的声明就必须进行初始化。
  • 引用只能绑定到左值上面。
  • 常量对象只能被常量引用绑定。

指针与 const

  • 指针本身也是一个左值,因此分为指针常量和指向常量的指针
  • int *const p 为常量指针,const int *p 为指向常量(const *)的指针

类的静态成员

  • static method 不能申明成 const(因为没有 this 指针)
  • static 成员变量的类型可以是不完全类型(声明之后,定义之前)
  • static 成员变量一般可以在类外进行定义和初始化(一般也不需要 static 关键字了),类型初始化需要常量表达式。
  • static 成员函数在类外只能提供定义。

constexpr

有两种使用方式: constexpr 变量 和 constexpr 函数。 两者都都是告诉编译器,这些变量和函数都能在编译期间得到结果,如果不符合相应的要求,则编译器会报错:

constexpr int scale(int i) {
    return i * 2;
}
int i = 10;
int y = scale(i); // correct
constexpr y = scale(i); // wrong because i is not a const variable

More