1. 构造函数
默认的构造函数有五个,分别是无参数、拷贝构造、赋值构造、移动拷贝构造、移动赋值构造。我们实现了某一个其他的就不会默认生成了。所以如果我们想使用系统默认为我们生成的那些构造函数,就需要用default显式地声明:demo(const demo &tmp) = default;
而有的时候,我们是不希望一些构造函数被生成的,这个时候可以使用delete来声明:demo(demo && tmp) = delete;
2. explicit 关键字
在 C++ 中,常常存在隐式类型转换,比如说double x = 1ll这样的语句其实就存在隐式类型转换。如果我们自己实现了一个类,同时实现了一个参数个数为一个的构造函数,那么系统就会准许这样的隐式类型转换,比如:
class A{public:A() = default;A(int a) {a_ = a}int geta_() { return a_; }private:int a_;};int main(){A tmpA = 10;cout << tmpA.a_ << endl;}// output: 10
如果我们不希望这样的隐式类型转换发生,那么就需要在这样的构造函数前面加上`explicit`关键字,这样上述代码就会编译失败。
