C++中生成对象的语法差异
Difference in syntaxes of making objects in C++
1)从名为"handler"的类创建对象的以下两种方法的确切区别是什么
handler myhandler;
handler myhandler=new handler();
2) 以下总是可能的吗?
handler *myhandler;
handler *myhandler=new handler();
handler myhandler;
这会创建一个对象。如果它在一个函数内,则它具有自动存储持续时间,并且当它超出范围时将自动销毁。如果它在函数之外,则它具有静态存储持续时间,并将在程序结束时自动销毁。
handler myhandler=new handler();
这可能不会编译;除非handler
有一个奇怪的构造函数,允许从指针进行隐式转换,在这种情况下,它会做一些奇怪的事情。
handler *myhandler;
它声明了一个指针,该指针可用于引用类型为handler
的对象。它不会创建对象,也不会指向任何对象。
handler *myhandler=new handler();
这会创建一个动态对象,并初始化一个指向它的指针。这通常是个坏主意,因为如果你不能正确删除它,很可能会导致内存泄漏(或更糟)。不要创建动态对象,除非你真的需要它们超过当前范围;并在需要时使用智能指针:
auto myhandler = std::make_unique<handler>(); // C++14
std::unique_ptr<handler> myhandler(new handler); // C++11
如果你真的想为了教育目的而篡改一个原始指针,那么记得在完成后删除它:
delete myhandler;
并特别注意确保这种情况只发生一次,即使抛出异常也会发生。
简单的答案是第二种方法是正确的。首先创建一个新对象,然后在上面分配一个新的对象。我强烈建议在继续之前理解这一点:
http://www.parashift.com/c++-faq/sel-assignment-how.html
在这两种情况下,您的程序都不应该编译,因为您正在重新定义对象。
第一种情况不应该在new
语句中编译,因为new
返回一个指向新创建对象的指针,除非有一个构造函数接受指针或重载的赋值运算符接受handler
指针。
在第二种情况下,它将指向新创建的对象。
纠正第一种情况,
handler myhandler=handler();
提供的handler
具有默认构造函数或具有默认参数的构造函数。
相关文章:
- 实例化对象并调用方法,使用单行语法在 C# 或 C++ 中返回值?
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 访问对象的取消引用值的语法
- 模板堆栈对象的数组;语法
- C 中的对象依赖性.什么是班级组成的语法
- 未知的 C++ 对象实例化语法
- (C++)用于实例化新对象并将其分配给指向相同对象类型的指针的 2D 向量的语法
- C++构造函数中的语法错误 - arugment 是对另一个类中的对象的引用
- 是否可以通过从lambda的引用中返回T型对象,而无需使用尾随返回类型语法
- 对象构造语法
- 使用自定义对象的地图使用MAP?可能是语法问题
- 无法弄清楚将多个对象函数作为单独的线程调用的语法
- 使用大括号初始化C++对象(语法)
- C++中生成对象的语法差异
- 使用std::sort与自定义排序对象和数据类型模板-寻找正确的语法
- 比较类语法帮助中的对象;
- 我们什么时候应该使用括号 ( ) 与初始值设定项 { } 语法来初始化 C++11 中的对象
- 语法错误:使用指向对象的指针调用成员函数指针
- C++中的对象初始化语法
- std::array 作为字段的语法是什么,里面的对象必须使用接受参数的 ctor 构造