您的两个声明都是具有自动存储持续时间的对象的定义。也就是说,它们都将在函数结束时被销毁。第一个是声明一个Object
类型对象,第二个是一个Object*
类型对象。
碰巧 for 的初始化程序myObject2
是一个new-expression。一个新的表达式动态分配一个对象并返回一个指向它的指针。myObject2
正在使用指向动态分配的指针进行初始化Object
。
因此,您正在目睹两种不同的创建对象的方式。一种是带有变量定义的,一种是带有new-expression 的。
任何其他方式都没有任何意义。想象一下,一个new 表达式没有返回指向对象的指针,而是直接引用了该对象。然后你可能会写这样的东西:
Object myObject2 = new Object();
但是,C++ 默认使用值语义。这意味着动态分配的对象将被复制到myObject2
其中,然后您就忘记了它。你没有办法再得到那个对象的地址了。新表达式返回一个指针,以便您拥有动态分配对象的句柄。
您可能会说,“这就是我用 Java 编写它的方式!” 但那是因为 Java 以不同的方式工作。在 Java 中,myObject2
是您设置为指向新Object
对象的引用。它不会以任何方式复制对象。
C++ 不要求在动态分配对象时必须使用指针。事实上,你可以做这样的事情(这是一种 Java 等价物):
Object& myObject2 = *(new Object());
但这是一个非常糟糕的主意。它突然掩盖了对象是动态分配的事实,并且很容易出错并忘记销毁对象(在Java中您不必关心)。至少有一个指针可能会提醒您这样做。然而,即使这样也可能导致错误或不清楚的代码,这就是为什么建议您尽可能使用智能指针。
简而言之:这就是new-expression 的行为方式。它动态分配一个对象,然后返回一个指向它的指针。