构造函数

构造函数和类同名,无返回值。且不能声明为const的。

如果我们不提供任何初始化器给对象,那么它就是默认初始化的(default initialized)。默认构造函数(default constructor) 就是不接受参数的。

如果我们不提供默认构造函数,编译器会为我们生成一个,即synthesized default constructor。对大部分类,synthesized构造函数 进行如下初始化:

  • 如果有in-class初始化,就使用它
  • 如果没有,则对成员进行默认初始化

编译器只有当你没有提供构造函数时,才去生成一个synthesized构造函数

一旦你提供了自定义的构造函数,就不会自动生成一个synthesized构造函数。这时如果你希望默认的构造函数也具有synthesized构造函数 同样的效果:

A() = default;

这是C++ 11引入的。

一个更具体的例子:

struct Sales_data {
   Sales_data() = default;
   Sales_data(const string &s): bookNo(s) {}
   Sales_data(const string &s, unsigned n, double p):
          bookNo(s), units_sold(n), revenue(p*n){}
   Sales_data(std::istream &);
   // other member 
   string isbn() const {return bookNo;}
   Sales_data& combine(const Sales_data&);
   string bookNo;
   unsigned units_sold = 0;
   double revenue = 0.0;    
};

上面的其它两种构造函数都是构造器初始化列表(constructor initializer list)。

另外,如果要使用默认的构造函数:

Sales_data obj(); // 定义函数
Sales_data obj2; // 定义对象

拷贝,赋值,和析构

如果我们不去手动地自定义这些方法,编译器会给我们生成默认的。但很多情况,我们不能依赖这些默认的。