c++ - 为结构(或类)行为数组赋值

标签 c++ arrays memory-management

从 Java 我习惯了我可以做到这一点:

public class SomeClass {
    public int field1;
}

SomeClass[] data = new SomeClass[10];
for (int i = 0; i < 10; i++) {
    data[i] = new SomeClass(); 
    SomeClass d = data[i];
    d.field1 = 10;
}

for (int i = 0; i < 10; i++) {
    SomeClass d = data[i];
    System.out.println("Value of data [" + i + "] is [" + d.field1 + "]");
}

这会很好地打印:

Value of data [0] is [10]
Value of data [1] is [10]
... etc

因此在 Java 中,您首先创建数组,默认情况下它具有所有空值,然后在第一个循环中我创建一个新的 SomeClass 并将其分配给数组中的一个槽。如果你不这样做,你会得到一个 NullPointerException。

一切顺利。

问题: 我尝试在 C++ 中做同样的事情。我有一个失败的例子和一个有效的例子。但我不确定它为什么起作用(或不起作用,取决于您选择的示例)。谁能详细说说?

首先是失败的代码:

int main(int argc, char **argv) {
    MyClass data[10];
    for (int y = 0; y < 10; y++) {
        MyClass d = data[y];
        cout << "INITIALLY (garbage): [" << d.field1 << ", " << d.field2 << "] " << endl;
        // assign values
        d.field1 = 2;
        d.field2 = 3;
    }

    // print out data of first 10
    cout << "Printing out data after initialization" << endl;
    for (int y = 0; y < 10; y++) {
        MyClass d = data[y];
        cout << "[" << d.field1 << ", " << d.field2 << "] " << endl;
    }
}

所以如果我理解正确的话,根据this StackOverflow question我可以像在上面的代码中那样创建一个结构数组。

我注意到,如果我不使用:

MyClass d = data[y];
d.field1 = 2;
d.field2 = 3;

但我这样做:

data[y].field1 = 2;
data[y].field2 = 3;

它确实有效。

但是,如果我坚持使用单独的值,我仍然可以通过这样做使其工作:

MyClass * d = &data[y];
d->field1 = 2;
d->field2 = 3;

我在打印输出时没有做任何更改。以及以上的作品。

所以,当使用指向 data[y] 的指针时,显然有些不同。不过,我找不到明确的答案。谁能解释一下原因?

如果这个问题是重复的,抱歉,我无法在 “为什么”部分。代码片段对我来说并不总是足够的 ;)

PPS:我知道我没有在堆中分配这个数组。触摸该主题以与之比较的奖励积分:)

最佳答案

在 C++ 中,对象是一个存储区域 - 即内存区域。变量直接表示对象,除非它们被明确限定为对现有对象的指针或引用。

当你写的时候:

MyClass d = data[y];

您正在声明一个MyClass类型的变量,定义它表示堆栈上的一个对象,然后初始化 它来自对象data[y]ddata[y] 是独立的对象,因此修改 d 不会影响 data[y]

你想写:

MyClass &d = data[y];
        ^--- here

& 符号 &d 表示为对对象 data[y]引用,所以只要由于对象继续存在于 data[y] 最初表示的存储区域(即在该地址),您可以使用 d 修改该对象。

使用指针是类似的,但是因为指针可以重新定位以指向不同的对象,所以您必须使用间接语法(*->)来表示该对象他们指向。

关于c++ - 为结构(或类)行为数组赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15088557/

相关文章:

C++(没有 MFC)禁用/灰色菜单项

arrays - 在包含自定义类的数组中查找值

python - 以不同顺序对多个列上的结构化 Numpy 数组进行排序

php - 是否有比 file_get_contents 占用更少内存或更有效的合并 MP3 的方法?

JavaScript 新关键字和内存管理

c++ - 我怎样才能部分特化可变参数模板函数

c++ - Qt 单选按钮在图标下方放置文本

c++ - boost::asio 从套接字读取 n 个字节到 streambuf

java - 如何在 Java 中制作可调整大小的数组?

C++ std::make_shared 内存泄漏