构造函数是一类关键的问题。

1. 构造函数

默认的构造函数有五个,分别是无参数、拷贝构造、赋值构造、移动拷贝构造、移动赋值构造。我们实现了某一个其他的就不会默认生成了。所以如果我们想使用系统默认为我们生成的那些构造函数,就需要用default显式地声明:
demo(const demo &tmp) = default;
而有的时候,我们是不希望一些构造函数被生成的,这个时候可以使用delete来声明:
demo(demo && tmp) = delete;

2. explicit 关键字

在 C++ 中,常常存在隐式类型转换,比如说double x = 1ll这样的语句其实就存在隐式类型转换。如果我们自己实现了一个类,同时实现了一个参数个数为一个的构造函数,那么系统就会准许这样的隐式类型转换,比如:

  1. class A{
  2. public:
  3. A() = default;
  4. A(int a) {a_ = a}
  5. int geta_() { return a_; }
  6. private:
  7. int a_;
  8. };
  9. int main()
  10. {
  11. A tmpA = 10;
  12. cout << tmpA.a_ << endl;
  13. }
  14. // output: 10
  1. 如果我们不希望这样的隐式类型转换发生,那么就需要在这样的构造函数前面加上`explicit`关键字,这样上述代码就会编译失败。