c中的动态对象

新手上路,请多包涵

我从 c# 来到 c++,我不明白什么是动态对象。因此,假设您有 A 类并创建像 A *a = new A() is Normal 这样的对象,但对象 a 是什么?它和数组一样还是什么?我们可以写成 a[0] 还是 a[1]?但是,如果我们重载 operator [] 并想要创建动态对象,如果我们在那里有数据并且想要正常获取数据,会发生什么?

原文由 icegas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 394
2 个回答

如果你写 A * a = new A() 类的默认构造函数 A 被调用,它为类的一个对象动态分配内存 A 和分配的内存地址分配给指针 a 。所以 a 指向类 A 的对象,而不是数组。但是,如果你想要一个动态的 A 对象的数组,那么你必须写这样的东西 A * a = new A[10] 。这将为 A 的 10 个对象分配内存。你可以写 a[0], a[1], ... a[9] 来访问数组的对象。

现在,如果我们重载 [] 运算符会发生什么? If we overload [] operator, then it should mean that the class A has some sort of array inside, and by writing a[1] , where aA 类的对象,我们想要获取位于第二个索引处的元素。 (一般来说,使用下标运算符可以表示任何其他含义,但您应该尽量坚持下标运算符的原始含义)。但是我们不能在指针上调用 [] 运算符,因为这意味着取消引用指针。因此,要在对象的指针上调用下标运算符,我们必须显式调用下标运算符。像这样:

 A * a = new A;
cout << a->operator[](0) << endl;

它创建 A 类的一个对象,并写入 a->operator[](0) 。它显式调用重载的下标运算符。如果我们动态创建一个数组呢?

 A * a = new A[6];
cout << a[0][0] << endl;

第一个下标运算符用于获取对象数组中的第一个对象。第二个下标运算符是调用对象的重载下标运算符 a[0]

编辑:我关于调用 A 类的下标运算符是错误的。感谢 jschultz410,他纠正了我。

原文由 Redwanul Haque Sourave 发布,翻译遵循 CC BY-SA 3.0 许可协议

指针就是它听起来的样子,它是 指向 其他地方的东西。

以你为例

A* a = new A;

这将变量 a 声明为指针。它指向 A 类的一个实例(一个对象)。

从图形上看,它可以看作

+---+ +---------------+
|一个 | ---> | A 的实例 |
+---+ +---------------+

在 C#(和 Java)中,这基本上是创建类实例的唯一方法。所有变量都是(稍微简化的)指针。

在 C++ 中,您还有其他选择:

 A a;

上面的定义表明变量 a A 类的一个实例。它不是引用,也不是指针,它 一个 A 对象。

现在来看上述两个定义之间的另一个区别:在第一种情况下, A 的实例是在 运行时 创建的。内存是在程序运行时为实例分配的。在第二种情况下,实例的空间由 编译器 在编译时分配。然而,在这两种情况下,构造函数都是在运行时调用的。

原文由 Some programmer dude 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题