最近我见过如下例子:
#include <iostream>
class Foo {
public:
int bar;
Foo(int num): bar(num) {};
};
int main(void) {
std::cout << Foo(42).bar << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这奇怪: bar(num)意味着什么?它似乎初始化成员变量,但我以前从未见过这种语法.它看起来像一个函数/构造函数调用,但对于一个int?对我没有任何意义.也许有人可以启发我.而且,顺便说一下,还有其他类似的深奥语言功能,你永远不会在一本普通的C++书中找到它吗?
在C++中,您可以使用初始化列表在构造函数开始运行之前初始化类的字段.例如:
Foo::Foo(string s, double d, int n) : name(s), weight(d), age(n) {
// Empty; already handled!
}
Run Code Online (Sandbox Code Playgroud)
我很好奇为什么Java没有类似的功能.根据Core Java:第1卷:
C++使用这种特殊语法来调用字段构造函数.在Java中,不需要它,因为对象没有子对象,只有指向其他对象的指针.
这是我的问题:
它们是什么意思"因为对象没有子对象?" 我不明白子对象是什么(我试着查找它); 它们是指扩展超类的子类的实例化吗?
至于为什么Java没有像C++这样的初始化列表,我认为原因是因为所有字段在Java中都已默认初始化,并且因为Java使用super关键字来调用super(或C++语言中的基础) - 类构造函数.它是否正确?