c ++中的动态对象

ice*_*gas 5 c++ pointers dynamic object

我从c#来到c ++,我不明白动态对象是什么.所以想象你有A类并且创建对象如A*a = new A()是Normal但是对象是什么?像阵列一样是什么?我们可以像[0]或​​[1]那样写吗?但是如果我们重载operator []并想要创建动态对象,如果我们有数据并且想要正常获取数据,会发生什么?

Som*_*ude 6

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

举个例子

A* a = new A;
Run Code Online (Sandbox Code Playgroud)

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

有些图形可以看作是

+---+      +---------------+
| a | ---> | instance of A |
+---+      +---------------+

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

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

A a;
Run Code Online (Sandbox Code Playgroud)

上面的定义说变量a A类的一个实例.它不是一个参考,它不是一个指针,它一个A对象.

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


Red*_*ave 4

如果您编写A * a = new A()类的默认构造函数,A则调用该类的默认构造函数,并为该类的一个对象动态分配内存A,并将分配的内存的地址分配给指针a。所以a指向类的对象A而不是数组。但是,如果您想要动态地获取对象数组A,那么您必须编写类似这样的内容A * a = new A[10]。这将分配 10 个对象的内存A。并且您可以写入a[0], a[1], ... a[9]来访问数组的对象。

现在,如果我们重载该运算符会发生什么[]?如果我们重载运算[]符,那么它应该意味着该类A内部有某种数组,并且通过编写a[1],其中a是 class 的对象A,我们想要获取位于第二个索引处的元素。(一般来说,您可以使用下标运算符表示任何其他含义,但您应该尽量坚持下标运算符的原始含义)。但是我们不能对[]指针调用运算符,因为这意味着取消引用指针。因此,要在对象的指针上调用下标运算符,我们必须显式调用下标运算符。像这样:

A * a = new A;
cout << a->operator[](0) << endl;
Run Code Online (Sandbox Code Playgroud)

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

A * a = new A[6];
cout << a[0][0] << endl;
Run Code Online (Sandbox Code Playgroud)

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

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