我从 c# 来到 c++,我不明白什么是动态对象。因此,假设您有 A 类并创建像 A *a = new A() is Normal 这样的对象,但对象 a 是什么?它和数组一样还是什么?我们可以写成 a[0] 还是 a[1]?但是,如果我们重载 operator [] 并想要创建动态对象,如果我们在那里有数据并且想要正常获取数据,会发生什么?
原文由 icegas 发布,翻译遵循 CC BY-SA 4.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 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
如果你写
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 classA
has some sort of array inside, and by writinga[1]
, wherea
是A
类的对象,我们想要获取位于第二个索引处的元素。 (一般来说,使用下标运算符可以表示任何其他含义,但您应该尽量坚持下标运算符的原始含义)。但是我们不能在指针上调用[]
运算符,因为这意味着取消引用指针。因此,要在对象的指针上调用下标运算符,我们必须显式调用下标运算符。像这样:它创建
A
类的一个对象,并写入a->operator[](0)
。它显式调用重载的下标运算符。如果我们动态创建一个数组呢?第一个下标运算符用于获取对象数组中的第一个对象。第二个下标运算符是调用对象的重载下标运算符
a[0]
编辑:我关于调用 A 类的下标运算符是错误的。感谢 jschultz410,他纠正了我。