20200216
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