1

我有一个关于课程的简单问题。

考虑以下对象 Apple(删除了默认构造函数)。

class Apple
{
private:
    bool _fruit;
public:
    Apple(bool fruit) : _fruit(fruit) { }
};

现在在堆栈/堆上声明它。

Apple p(true);
Apple * o = new Apple(true);

好吧,貌似第二个是指针,意思是我不用直接声明。

我可以做Apple * o; 并稍后将其构造为o = new Apple(true);

但是在堆栈上呢?声明苹果 p; 会给我一个编译错误。

以后如何构造 p 而不必直接在定义上这样做?非常感激。

4

2 回答 2

2

即使您想在堆栈上分配内存,您也可以自由地分开分配和初始化(构造)。尽管您可能需要一个充分的理由这样做。

  • 您可以通过简单地分配字节数组来分配内存而无需初始化。

    char space[sizeof(Apple)];
    
  • 可以使用放置 new调用构造函数而无需分配。

    Apple& o = *new (space) Apple(true);
    
  • 最后,不要忘记在空间超出范围之前手动调用析构函数。

    o.~Apple();
    
于 2013-08-03T11:34:45.380 回答
1

您不能这样做,也不应该尝试,因为在堆栈上声明对象的全部意义在于自动初始化和销毁​​。

如果您正在寻找一种实现延迟初始化的方法,那么您正在寻找错误的方向。

于 2013-08-03T11:19:38.347 回答