相关疑难解决方法(0)

构造函数中这个奇怪的冒号成员(":")语法是什么?

最近我见过如下例子:

#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++ syntax constructor c++-faq ctor-initializer

325
推荐指数
11
解决办法
10万
查看次数

为什么Java没有像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中,不需要它,因为对象没有子对象,只有指向其他对象的指针.

这是我的问题:

  1. 它们是什么意思"因为对象没有子对象?" 我不明白子对象是什么(我试着查找它); 它们是指扩展超类的子类的实例化吗?

  2. 至于为什么Java没有像C++这样的初始化列表,我认为原因是因为所有字段在Java中都已默认初始化,并且因为Java使用super关键字来调用super(或C++语言中的基础) - 类构造函数.它是否正确?

c++ java constructor initialization initialization-list

54
推荐指数
2
解决办法
2万
查看次数