天天看点

c++之构造函数详解C++构造函数的理解构造函数的语法

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;

    这个构造函数不接受任何参数,等于默认构造函数。

继续阅读