只是一个简单的问题。正如标题所示,我只使用“new”运算符来创建一个类的新实例,所以我想知道另一种方法是什么以及如何正确使用它。创建一个没有“新”操作符的类的新实例
回答
你也可以有你的类自动情况下,不使用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,与新略有不同。 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!
要知道什么是投放新的,阅读这些常见问题解答:
- What is "placement new" and why would I use it?(在parashift.com FAQ)
- placement new(在stackoverflow.com FAQ)
你可以只申报一个普通变量:
YourClass foo;
假设它有一个默认的构造函数。 – Nick 2011-05-04 15:14:40
我在哪里可以找到关于“正常变量”的更多信息? – 2016-01-05 13:03:54
不应使用new创建C++中的大多数对象。当你需要创建的对象的数量
class Person {
...
};
int main() {
int x = 3;
boolean b = true;
Person p("fred");
}
创建新的对象应保留的场合,当你需要多态,或可能:相反,你应该以同样的方式,你将创建整数或布尔创建它们,但在编译时你不知道有多少。
不,关于如何创建对象的决定取决于对象应该生存多长时间。如果它只存在于给定函数的范围和生命周期内,那么将其作为一个'auto'局部变量是有意义的。如果它必须存在于函数执行之外,则需要动态分配。还有的创建多少个对象的问题,即,而是具有单个实例它们的列表或数组。 – 2011-05-04 15:20:31
一点也不 - 我可以在一个函数创建一个实例,并通过复制,它返回到调用函数,我会为一个整数的一个实例。做你写的回报的std ::字符串通过指针返回它们的全部功能? – 2011-05-04 15:23:11
这听起来像你真的喜欢复制对象... – 2013-06-30 20:52:46
使用malloc会给你新的结果,只是不调用构造函数。
不完全错误的,所以没有-1 ...这只有在构造函数什么都不做类没有任何虚方法有点正确? – 2011-05-05 04:48:29
任何常用的方法:作为本地或静态变量,或作为临时的。一般而言,当对象具有标识并且生命周期不对应于作用域或其多态时,在C++中使用new
的唯一时间为 。 (当然有 例外,但不是很多。)如果对象可以复制 ,通常最好使用本地实例,根据需要复制 。 (就像你会为int
,其实。)
- 1. C++新操作符。创建一个新实例
- 2. 创建一个新的类实例
- 3. 实例化一个没有“新”的类
- 4. 如何在没有新操作员的情况下创建新实例?
- 5. 创建同一类型的新实例作为另一个intsance
- 6. Python没有创建一个新的干净实例?
- 7. 维护一个DAO类实例池与做新操作符
- 8. @GeneratedValue当创建一个新的实例
- 9. CRM创建一个CrmConnection的新实例
- 10. 创建一个新的weka实例
- 11. 创建一个新的堆栈操作
- 12. 在scala中动态创建一个案例类的新实例
- 13. ExecutorService - 在方法中创建新实例vs每个类创建一个实例
- 14. 基于现有实例创建类的新实例
- 15. 有没有使用新的创建一个实例的另一种方法?
- 16. 创建一个COM互操作类的实例
- 17. Java中,一个类的多个实例重置最新创建的实例
- 18. 创建类的新的实例,作为字符串和更新设置方法
- 19. 有没有创建它的实例有一个类可以吗?
- 20. 在Android中创建新类的实例
- 21. 在另一个私有类中创建私有类的新实例
- 22. 创建一个n最常见的类型的新实例
- 23. 是否有一个call_user_func()等同于创建一个新的类实例?
- 24. 创建KClass的新实例
- 25. 使用类类的一个对象来创建一个新的实例
- 26. 在打字稿中创建一个类的新实例
- 27. 使用变量创建一个[泛型类型]的新实例
- 28. 如何在处理中创建一个类的新实例
- 29. 在Java中主要创建同一个类的新实例
- 30. 如何从其基类的实例创建一个新对象?
+1:我想知道*不是动态分配*的正确术语是什么。 *自动* - 谢谢! – 2011-05-04 15:16:34
此外,要了解使用自动实例的优点,您需要了解[RAII](http://stackoverflow.com/questions/712639/)。 – 2011-05-04 15:20:51
'auto'变量有时也被称为'stack'变量。有多少程序员实际上使用'auto'关键字? – 2011-05-04 15:23:44