概述
我们都知道,编译器会给我们书写的类合成一些函数:构造函数、拷贝构造、拷贝赋值、析构函数等等。合成的函数都是public且inline的。但是什么时候合成呢?带着疑问我们往下看。
1、什么是构造函数?
构造函数就是一类特殊的成员函数,用来控制对象的初始化过程。无论何时类的对象被创建,就会自动调用构造函数,构造函数不能手动调用。
语法:函数名与类名相同,并且没有返回类型的函数。
说明:
1、类可以包含多个构造函数,和重载函数差不多。
2、构造函数不能被声明成const的。
3、跟防控属性无关系,可以是public、protected或者private。
class SalesData
{
SalesData(){}; //没有参数的构造函数
SalesData(int a = 5, char c = ‘a’){}; //含有默认参数的“无参构造”
SalesData(int ia, int ib){}; //含有两个int参数的构造函数
}
通过上面的例子,我们可以看出:无参构造并一定是没有参数的,而是可以用无参的形式被调用。
但是实际上我们写代码时,有时会不写构造函数,但是为啥类的对象也可以创建?
2、默认构造
如果我们没有编写构造函数时,编译器会在需要的时候给我们合成一个默认的构造函数。注意是在需要的时候,什么时候是需要的时候?先看一个列子:
class Foo
{
public:
int ival;
Foo* pNext;
};
这里正确的语意是要求Foo有一个构造函数,可以将两个成员变量初始化为0。但是这里编译器并没有合成构造函数。其间的差别在于一个是程序的需要,一个是编译器的需要。程序有需要那是程序员的责任,上面的例子就是程序的需要,而不是编译器的需要。
只有编译器合成出的构造函数是有用的,可以进行一些默认调用时,编译器才会合成。主要分为了下列四种情况: