为什么我们需要编译器定义的构造函数?

时间:2010-07-28 19:57:22

标签: c++

编译器定义的构造函数为空,并且不初始化成员变量。那为什么编译器会创建一个?

如果编译器定义的构造函数和用户定义的空构造函数之间有什么区别呢?

6 个答案:

答案 0 :(得分:5)

构造函数的存在与否会影响类的用户如何实例化对象。如果编译器没有创建默认构造函数,那么除非你创建了自己的构造函数,否则你将无法使用类或结构。

答案 1 :(得分:2)

编译器定义的ctor应使用默认ctors为这些变量的类型初始化成员变量。只有POD成员保持未初始化状态。另请注意,当/如果使用继承时,ctor与基类ctors一起使用来创建对象。

当你自己定义一个ctor时,会停止编译器为你生成其他ctor。例如,如果你有类似的东西:

struct X { 
    int a;
public:
    X(int) {}
};

int main() { 
   X x;    // error: no default ctor defined
   X x = X(3); // no problem.
}

你已经定义了一个带有int参数的ctor,这意味着编译器将为你生成一个默认的ctor,所以X x;将不起作用 - 你需要指定一个int参数(将被忽略)或者为该类定义一个默认的ctor。如果您注释掉上面定义的ctor,那么然后编译器将生成一个默认的ctor,因此X x;将起作用。

答案 2 :(得分:1)

<强> Java的特定

如果没有为类定义构造函数,编译器会自动创建默认的无参数构造函数。默认构造函数调用默认的父构造函数(super())并将所有实例变量初始化为默认值(数值类型为零,对象引用为null,布尔值为false)。

如果为类定义任何构造函数,则不会自动创建默认构造函数。

答案 3 :(得分:0)

因此,当您不需要使用空构造函数时,您不必编写空构造函数。

编译器定义的构造函数始终是公共的和非显式的。如果需要,可以通过显式或私有来自定义空构造函数。

答案 4 :(得分:0)

并非所有编译器都会创建一个零初始化数据成员的默认构造函数。我目前正在使用一些不使用defualt构造函数对数据成员进行零初始化的方法。

大多数主要系统的主要编译器都会进行初始化(VS 2010,Windows上的gcc,Linux,Free BSD,Solaris)

答案 5 :(得分:0)

行为是一样的。显式创建默认构造函数的唯一原因是除了通常由编译器创建的默认构造函数之外还需要创建一些其他构造函数。如果您显式创建构造函数,编译器将不会创建默认构造函数,无论该构造函数是否为默认构造函数。