什么时候构造函数称为“默认构造函数”?

问题描述 投票:0回答:4

如果我们说

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

c++ terminology default-constructor
4个回答
19
投票

默认构造函数是无需参数即可调用的构造函数。

C++98§12.1/5

Xdefault

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


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

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

推荐阅读:

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

.

+------> Implicitly GENERATED by compiler | | Default Constructor -----+ | | +------> Explicitly provided by programmer

4
投票
基本上,默认 ctor 是不带参数的 ctor。

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

class WontGenerateDefCtoByCompiler { private: char* iHaHaPtr; };

原因是编译器没有发现任何需要初始化程序员提供的指针。正确编写和初始化默认构造函数是程序员的责任。

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

这些是编译器将隐式生成默认构造函数的唯一 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

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

你不能只说“编译器创建的构造函数也是默认构造函数”。如果没有声明构造函数,编译器会生成一个默认构造函数

1
投票
一个复制构造函数(如果我们在这里谈论 C++0x,则可能还生成一个移动构造函数)。当您仅提到“编译器创建的构造函数”时,您实际上是在同时谈论至少两个构造函数。所以你只能说“编译器创建的

default 构造函数也是默认构造函数”,但这听起来像是 Capt. Obvious 会说的。

© www.soinside.com 2019 - 2024. All rights reserved.