-3

在java中可以编写类似的代码

public class Print{
int n=10;
String path="C:\\file.txt";
}

在创建对象之前,这些数据成员的内存分配在哪里?我想我们不能在 C++ 中做同样的事情!用 C++ 和 Java 解释我...

4

3 回答 3

3

在 Java 中,有一个名为 Class 的类,每个加载到运行时的类都有一个 Class 对象。这些类对象包含初始化所需的 10 和“C:\file.txt”等数据。

在 C++11 中,您也可以这样做,(至少它看起来是一样的,并且以 C++ 的方式具有相同的语义):

class Print
{
  int n = 10;
  std::string path = "C:\\file.txt";
};

在 C++03 中这是不可能的,您必须在每个构造函数中初始化成员。C++11 中的实现方式与 Java 不同:与 Java 不同,C++ 中没有 Class 对象,运行时没有类加载。在 C++11 中,编译器将这种成员初始化器视为您在每个构造函数中手动编写了初始化器。在已编译的程序代码中的某处,您有 10 和“C:\file.txt”,并且每个构造函数的代码都包含一个部分,其中将要构造的对象的两个成员使用这些值进行初始化。也就是说,除非您在构造函数中显式初始化一个或两个成员,否则会覆盖默认初始化程序。

于 2013-02-04T08:11:55.070 回答
0

在 java 中,在使用关键字“new”或字符串为其赋值之前,不会为对象分配内存。

于 2013-02-04T08:02:48.647 回答
0

n在 Java和C++ 中,您不能path在创建类型对象Print之前访问变量。对象将在哪种内存中创建,在同一类型的内存中将创建它的所有字段。

在 C++ 中,当您创建这样的对象时

void foo() {
    Print obj;
}

它将在堆栈中创建。如果你创建一个像这样的对象

void foo() {
    Print * obj = new Print;
}

它将在堆中创建。

在 Java 中,您只能创建堆分配的对象,因此对象本身和它的字段都将被放入堆中。

请注意,在声明中初始化类的字段只允许在 C++11 中,而不是在 C++03 中

于 2013-02-04T08:05:45.900 回答