缩窄错误
当将一个范围更大的变量赋值给范围较小的变量时,如int到short, 就会出现缩窄错误。
但是正常赋值的话,编译不会有问题,部分编译器会有个警告,运行时可能会出现错误。
- 使用列表初始化可以避免这种错误,它会直接在编译阶段抛出错误。
1
2int large = 1;
float small{large}; //compile error
auto 类型推断
可以根据赋给变量的初值,自动推断出其类型。
也可用于函数返回类型1
auto intNum = 1; //int
constexpr 定义常量表达式
1 | constexpr double GetPi(){ |
lambda 函数
optional parameters{ statements; }
new 和 delete
1 | //使用try_catch 处理分配异常。 |
指针
- 务必初始化指针变量,否则它将包含垃圾值。
- 务必仅在指针有效时才使用它,否则程序可能崩溃。
- 对于使用 new 分配的内存,一定要记得使用 delete 进行释放,否则应用程序将泄露内存.
- 指针被delete之后不应该再访问它.
- 不要对一个指针多次delete
指针与const
1 | //根据const 离谁更近, 则修饰谁。 |
类
构造函数
为避免类的隐式转换,可以在构造函数前加explicit。
复制构造函数
- 当函数参数使用值传递时, 对象会被复制一份, 然后在函数内使用。
- 如果类没有复制构造函数, 那么会默认才用二进制复制的方式,指针是浅复制,可能会出问题。
- 如果有复制构造函数, 则会通过复制构造函数实现复制。
- 复制构造函数的参数必须按引用传递, 否则会不断调用自己。
- 复制构造函数的参数最好使用
const - 除非万不得已, 不要将类成员声明为原始指针。
- 使用原始指针的情况下, 必须要写复制构造函数和复制赋值运算符。
移动构造函数
特殊的类
禁止复制
私有的复制构造函数,私有的赋值运算符重载
单例类
禁止复制的类, 并且私有的构造函数, 提供静态实例
禁止在栈中实例化的类
私有的析构函数, 并提供静态函数,在类内部delete
在栈中实例化的对象,出栈时自动析构, 私有的析构函数会导致析构失败。
使用子类调用父类方法
1 | //当子类中只重载了父类部分函数时,未重载的同名函数会被隐藏。 |
final
禁止继承
多线程
std::thread
std::mutex
std::lock_guard
std::unique_lock
std::future
std::packaged_task
std::condition_variable