【发布时间】:2021-02-16 15:26:13
【问题描述】:
这里是 Java 程序员,C++ 新手。我一直在使用 C 风格的“传统”数组(类似于 java 中的数组)。我理解在 C++ 中我们可以创建一个简单的数组,如下所示:
Person people[3];
这个数组的内容本质上是未初始化的垃圾值。当我打印出数组中每个元素的内容时,我(相信)正在获取每个元素的内存地址。
for(int i = 0; i < 3; i++){std::cout << &person[i] << std::endl;}
结果:
//Note, I get different results here when I use an enhanced for loop vs an iterator for loop. Weird.
00EFFB6C
00EFFBA8
00EFFBE4
现在,这是我未能得到明确解释的部分。我创建了一个指向数组中元素之一的指针。然后我从那个指针中请求一些值 back 。在 java 中,我希望得到一个空指针,但在 C++ 中,这不会发生。
相反,我得到了默认值,就好像这个元素被初始化了:
Person* person1Ptr = &people[0];//Points to an uninitialized value
std::cout << person1Ptr->getFirstName() << std::endl;//Output: "Default First Name", expected nullptr
当我尝试使用引用获取元素的名字时,这不起作用(可能是因为该值不存在)。
完整粘贴代码:https://pastebin.com/cEadfJhr
根据我的研究,C++ 不会自动用指定类型的对象填充数组。
我的 person1Ptr 如何返回值?
【问题讨论】:
-
打错了,抱歉 - 现在修复
-
在
Person people[3];中,3 个Person元素的初始状态取决于Person是什么。如果它是class类型,它们将被默认初始化。这是否意味着存在未初始化的数据取决于Person的实现方式。 -
“根据我的研究,C++ 不会自动用指定类型的对象填充数组。” 这是不正确的。由于您来自 Java 背景,您可能会先入为主地认为
Person是Person实例的某种形式的句柄。在Person people[3];的情况下,无论如何,您都有三个Person的实际实例。您可能会想到 C++ 可能不会将这些对象初始化为有意义的值。这是否发生取决于Person的详细信息。 -
您应该共享一个minimal reproducible example,包括
Person的简短定义,它会产生您目睹的行为。如果不了解更多关于您的测试的信息,很难具体回答问题。 -
Person是一个带有默认构造函数的class类型,因此所有三个元素都是默认构造的。