【问题标题】:Is there a construct like Java initializing blocks in C++?在 C++ 中是否有像 Java 初始化块这样的结构?
【发布时间】:2012-05-09 16:35:10
【问题描述】:

我在一些文章中读到,在 java 中有一种叫做 Initializing blocks 的东西;当加载类或创建实例时,我们可以在其中执行一些初始化分配。

除了方法和构造函数,初始化块是Java程序中第三个可以执行操作的地方。

class InitDemo
{
     static int y;
     int x;
 {
   y = 10;
   x =  0;
 }
}

我在问 C++ 中是否有这样的范例? 谢谢。

【问题讨论】:

  • C 没有“加载”类的概念,它的静态视图与 Java 完全不同。所以,除了静态初始化器之外,没有什么类似的。
  • (本质上,Java 中的static 块是类的构造函数,因为类是(半)成熟的对象。C++ 类不是对象。)
  • 感谢您提供的信息,这很有帮助。
  • (我应该指出,您上面的块不是static init 块。请参阅下面的帖子。)

标签: java c++


【解决方案1】:

需要指出的是,Java中有两种不同形式的初始化块。裸露的{...} 块,没有关键字static,只是编译器有点混乱——块中的文本被附加到任何定义的构造函数的前面——不会生成单独的代码段。另一方面,以static {... 开头的块是一个静态初始化块,它本身就是一个(半)适当的过程(毫不奇怪,命名为“静态”)。

static 块只执行一次,在加载类后立即(有一些警告)。每次执行构造函数时都会执行非静态初始化程序(通过复制到构造函数中),因此通常不适合静态初始化。

【讨论】:

    【解决方案2】:

    简而言之,C++ 没有这个 Java 构造的直接等价物。

    要获得类似的行为,您必须从InitDemo 的构造函数中设置xy(您也可以在Java 中这样做)。

    【讨论】:

    • 是的,确实是 aix,我看到与 java 相比,构造函数仍然是为 C++ 初始化赋值的唯一位置。
    • @Blood-HaZaRd:差不多。在 Java 中,(非static)初始化块只是将一些通用代码放入每个构造函数中的一种方式。
    • 是的,除此之外还有两种我认为有用的静态 intilizing 块和非静态。
    猜你喜欢
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多