默认构造函数,Java与C++

Adr*_*hum 6 c++ java constructor

术语"默认构造函数"在Java和C++中都是官方的,在这两个世界中它似乎意义不同.我是否知道我的理解是否正确以及某些相关概念的正确命名是什么?

  1. Java中的默认构造函数表示当没有为类定义构造函数时由Compiler生成的(No-arg)构造函数.

  2. C++中的默认构造函数表示可以不带参数调用的构造函数.

给出以下示例

Java的:

class NoCtorClass {
    // No ctor defined, compiler is generating one   --------- J-1
}

class NoArgCtorClass {
    public NoArgCtorClass() { ... } -------------------------- J-2
}
Run Code Online (Sandbox Code Playgroud)

C++:

class NoCtorClass {
    // implicitly NoCtorClass() constructor is provided -------- C-1
}

class DefaultCtorClass {
public:
    // Explicitly telling compiler to give the default one
    DefaultCtorClass() = default;  ---------------------------- C-2
}

class NoArgCtorClass {
public:
    NoArgCtorClass();  ----------------------------------------- C-3
}
NoArgCtorClass::NoArgCtorClass() {....}


class NoArgCtor2Class {
public:
    NoArgCtor2Class(int i = 0); -------------------------------- C-4
}
NoArgCtor2Class::NoArgCtor2Class (int i = 0) {....}
Run Code Online (Sandbox Code Playgroud)

在Java中,只有J-1被正式称为默认构造函数,而J-2则不是.

在C++中,所有C-1到C-4都被正式称为默认构造函数.

我的理解是否正确?

如果是这样,术语中的一些问题:

  1. 对于没有参数的ctor,Java中的正确名称是什么?(即J-1和J2).我通常称之为No-Arg Constructor.(对应于C++中default-ctor的概念)

  2. C++中编译器生成的ctor的正确名称是什么?(即C-1和C-2.使用关键字default,它似乎应该被称为默认值.那么它应该被称为"默认默认构造函数"吗?(对应于Java中default-ctor的概念)

  3. 与2类似,我们应该如何调用编译器生成的Copy-ctor,赋值运算符等?"默认拷贝构造"?

ale*_*ddy 1

在 java 中,两者都称为默认构造函数。Java 编译器在内部生成不带参数的构造函数。如果您指定不带 args 的构造函数,则就像您正在覆盖构造函数一样。

public NoArgCtorClass() { ... }
Run Code Online (Sandbox Code Playgroud)

例如,当您实例化对象时,您保留在 { ... } 中的任何代码都会被执行...

注意:如果您有重载的构造函数,则需要显式编写默认构造函数,因为在这种情况下编译器不会生成无参数构造函数。

  • *“在 java 中,两者都称为默认构造函数。”* 不,它们不是。http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.8.9 (3认同)