构造函数
构造函数和类同名,无返回值。且不能声明为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; // 定义对象
拷贝,赋值,和析构
如果我们不去手动地自定义这些方法,编译器会给我们生成默认的。但很多情况,我们不能依赖这些默认的。