创建没有“new”运算符的类的新实例

时间:2011-05-04 15:10:10

标签: c++ class

只是一个简单的问题。正如标题所示,我只使用“new”运算符来创建类的新实例,所以我想知道另一种方法是什么以及如何正确使用它。

5 个答案:

答案 0 :(得分:29)

您还可以将您的课程的自动实例用作new,因为:

class A{};

//automatic 
A a;             

//using new
A *pA = new A();

//using malloc and placement-new
A *pA = (A*)malloc(sizeof(A));
pA = new (pA) A();

//using ONLY placement-new
char memory[sizeof(A)];
A *pA = new (memory) A();

最后两个使用placement-new,与 new 略有不同。 placement-new用于通过调用构造函数来构造对象。在第三个示例中,malloc仅分配内存,而不调用构造函数,这就是 placement-new 用于调用构造函数构造对象的原因。

另请注意如何删除内存。

  //when pA is created using new
  delete pA;

  //when pA is allocated memory using malloc, and constructed using placement-new
  pA->~A(); //call the destructor first
  free(pA); //then free the memory

  //when pA constructed using placement-new, and no malloc or new!
  pA->~A(); //just call the destructor, that's it!

要了解什么是贴牌新品,请阅读以下常见问题解答:

答案 1 :(得分:5)

您可以声明一个普通变量:

YourClass foo;

答案 2 :(得分:2)

任何常用方法:作为本地或静态变量,或作为 暂时的。通常,您在C ++中使用new的唯一情况是 当对象具有身份而生命周期没有 对应于范围,或者它是多态的。 (有 例外,当然,但并不多。)如果对象可以 复制后,通常最好使用本地实例,复制 那些根据需要。 (就像你对int所做的那样,事实上。)

答案 3 :(得分:0)

使用malloc会给你与new相同的结果,只需不调用构造函数。

答案 4 :(得分:-3)

不应使用new创建C ++中的大多数对象。相反,您应该以与创建整数或布尔值相同的方式创建它们:

class Person {
    ...
};


int main() {
    int x  = 3;
    boolean b = true;
    Person p( "fred" );
}

使用new创建对象应该保留用于需要多态的情况,或者可能需要创建多个对象时,但是在编译时你不知道有多少。