C++构造函数的理解
相对于C语言来说,C++有一个比较好的特性就是构造函数,即类通过一个或者几个特殊的成员函数来控制其对象的初始化过程。构造函数的任务,就是初始化对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。
构造函数的语法
构造函数的名字必须和类名相同,与其他函数不一样的是,构造函数没有返回值,而且其必须是公有成员,因为私有成员不允许外部访问,且函数不能声明为const类型,构造函数的语法是这样的:
class Test
{
public:
Test()
{
std::cout<<"Hello world!"<<std::endl;
}
};
Test object;
int main()
{
return 1;
}
在main函数执行之前,object被定义时就会调用Test函数,输出"Hello world!"。
这里只是示范了一个最简单的构造函数的形式,其实构造函数是个比较复杂的部分,有非常多神奇的特性。
构造函数的种类
默认构造函数
当我们程序中并没有显式的定义构造函数时,系统会提供一个默认的构造函数,这种编译器创建的构造函数又被称为合成的默认构造函数,合成构造函数的初始化规则是这样的:
- 如果存在类内的初始值,用它来初始化成员。在C++11的新特性中,C++11支持为类内的数据成员提供一个初始值,创建对象时,类内初始值将用于初始化数据成员。如果在构造函数中又显式地初始化了数据成员,则使用显式初始化的值。
- 否则,默认初始化该成员。默认初始化意味着和C语言一样的初始化方式,当类对象为全局变量时,在系统加载时初始化为0,而作为局部变量时,由于数据在栈上分配,成员变量值不确定。
需要注意的是,只有当用户没有显式地定义构造函数时,编译器才会为其定义默认构造函数。
在某些情况下,默认构造函数是不合适的:
- 如上所说,内部定义的类调用默认构造函数会导致成员函数的值是未定义的。
-
如果类中包含其他类类型的数据成员或者继承自其他类,且这个类没有默认构造函数,那么编译器将无法初始化该成员。上面提到了可以在类内给成员一个初始值,但是这只对于普通变量,并不支持类的构造。
当我们除了自定义的其他构造函数,还需要一个默认构造函数时,我们可以这样定义:
Test() = default;
这个构造函数不接受任何参数,等于默认构造函数。