C++中生成对象的语法差异

Difference in syntaxes of making objects in C++

本文关键字:语法 对象 C++      更新时间:2023-10-16

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具有默认构造函数或具有默认参数的构造函数。