10

如果我们说default constructor是那个没有参数的构造函数,我们是否也可以说编译器创建的构造函数也是一个default constructor

谢谢。

4

4 回答 4

18

默认构造函数是可以不带参数调用的构造函数。

C++98 §12.1/5

类的默认构造函数是可以在没有参数的情况下调用X的构造函数。X如果 class 没有用户声明的构造函数X,则隐式声明默认构造函数。

于 2011-01-29T11:32:12.947 回答
8

默认构造函数是可以不带参数调用的构造函数。所以这要么是一个没有参数的构造函数,要么是一个参数都具有默认值的构造函数。

但是,是的,如果您不提供任何其他构造函数,编译器会生成一个默认构造函数。

推荐阅读: http: //www.parashift.com/c++-faq-lite/ctors.html#faq-10.4

于 2011-01-29T11:30:38.887 回答
4
                         +------> Implicitly GENERATED by compiler
                         |
                         |
Default Constructor -----+
                         |
                         |
                         +------> Explicitly provided by programmer

基本上,默认 ctor 是没有参数的 ctor。

请注意,在以下情况下编译器不会生成任何默认 ctor:

    class WontGenerateDefCtoByCompiler
    {
private:
    char* iHaHaPtr;
    };

原因是编译器认为不需要初始化程序员提供的指针。正确编写和初始化默认 ctor 是程序员的责任。

另一方面,如果您在上述类中编写虚函数,编译器肯定会生成一个默认 ctor(但不会为您初始化 iHahaptr 指针)。此外,只有在程序中创建了该对象的实例时才会生成这样的 ctor(否则,编译器将不会生成任何 ctor)。

这些是编译器将隐式生成默认 ctor 的仅有 4 个条件(如果程序员未提供):

(1) The class has a virtual function (Why? need to setup vptr correctly )
(2) The class is derived from another class that has default ctor (either implicitly generated or explictly provided)
(3) The class has a member that has default ctor (either implicitly generated or explictly provided)
(4) The class is virtually derived from other class 

在所有其他情况下,编译器不会生成任何默认 ctor。

于 2011-01-29T12:24:20.550 回答
1

不能只说“编译器创建的构造函数也是默认构造函数”。如果没有声明构造函数,编译器会生成一个默认构造函数一个复制构造函数(如果我们在这里讨论 C++0x,可能还有一个移动构造函数)。当您仅提及“编译器创建的构造函数”时,实际上您同时在谈论至少两个构造函数。所以只能说“编译器创建的默认构造函数也是默认构造函数”,但这听起来像是Capt. Obvious会说的话。

于 2011-01-29T11:56:32.093 回答