12.什么是类的默认构造函数-灵析社区

菜鸟码转

默认构造函数(default constructor)就是在没有显式提供初始化式时调用的构造函数。它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义。如果定义某个类的变量时没有提供初始化时就会使用默认构造函数。

1.用户定义的默认构造函数:

  • 用户自定义的不带参数的构造函数:

C++

#include <iostream>

using namespace std;

class A
{
public:
    A(){ // 类的默认构造函数
        var = 10;
        c = 'q';
    }
    A(int val = 10)
    int var;
    char c;
};

int main()
{
    A ex;
    cout << ex.c << endl << ex.var << endl;
    return 0;
}
/*
运行结果:
q
10
*/

说明:上述程序中定义变量 ex 时,未提供任何实参,程序运行时会调用默认的构造函数。

  • 用户自定义的构造函数,但为所有形参提供默认值的构造函数:

C++

#include <iostream>

using namespace std;

class A
{
public:
    A(int _var = 10, char _c = 'q'){ // 类的默认构造函数
        var = _var;
        c = _c;
    }
    int var;
    char c;
};

int main()
{
    A ex;
    cout << ex.c << endl << ex.var << endl;
    return 0;
}
/*
运行结果:
q
10
*/

说明:上述程序中定义变量 ex 时,未提供任何实参,程序运行时会调用所有形参提供默认值的构造函数。

2.编译器自动分配的合成默认构造函数

如果用户定义的类中没有显式的定义任何构造函数,编译器就会自动为该类型生成默认构造函数,称为合成的默认构造函数。

C++

#include <iostream>

using namespace std;

class A
{
public:
    int var;
    char c;
};

int main()
{
    A ex;
    cout << ex.c << endl << ex.var << endl;
    return 0;
}
/*
运行结果:

0
*/

此时编译器会自动为 A 分配一个默认的构造函数,在上述示例中,类 A 中的变量 c 默认赋值为 \0,var 默认赋值为 0。

一般情况下,如果类中包含内置或复合类型的成员,则该类就不应该依赖于合成的默认构造函数,它应该定义自己的构造函数来初始化这些成员。多数情况下,编译器为类生成一个公有的默认构造函数,只有下面两种情况例外:

  • 一个类显式地声明了任何构造函数,编译器不生成公有的默认构造函数。在这种情况下,如果程序需要一个默认构造函数,需要由类的设计者提供。
  • 一个类声明了一个非公有的默认构造函数,编译器不会生成公有的默认构造函数。
  • 在大多数情况下,C++ 编译器为未声明构造函数之 class 合成一个默认构造函数:
  • 如果该类没有任何构造函数,但是包含一个对象类型的成员变量,且该变量有一个显式的默认构造函数;
  • 如果该类没有任何构造函数,但是其父类含有显式的默认构造函数;
  • 如果该类没有任何构造函数,但是含有(或父类含有)虚函数;
  • 如果该类没有任何构造函数,但是带有一个虚基类;

阅读量:2020

点赞量:0

收藏量:0