【问题标题】:Difference in syntaxes of making objects in C++在 C++ 中创建对象的语法差异
【发布时间】:2013-12-08 06:54:28
【问题描述】:

1)以下两种从名为“handler”的类中创建对象的方式的确切区别是什么

handler myhandler;
handler myhandler=new handler();

2) 以下是否总是可能的?

handler *myhandler;
handler *myhandler=new handler();

【问题讨论】:

  • 类的名称是handler还是myhandler?
  • 对不起,我已经更正了
  • 你的程序不应该编译。
  • 您应该阅读初学者 C++ 教程。一个体面的解释了静态分配和动态分配之间的区别。

标签: c++ oop object new-operator


【解决方案1】:
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;

并特别注意确保这只发生一次,即使抛出异常也会发生。

【讨论】:

    【解决方案2】:

    简短的回答是第二种方法是正确的。第一个创建一个新对象,然后在其上分配一个新对象。我强烈建议在继续之前了解这一点:

    http://www.parashift.com/c++-faq/self-assignment-how.html

    【讨论】:

    • 更不用说第一个甚至没有编译。
    【解决方案3】:

    你的程序不应该编译,因为你在这两种情况下都重新定义了一个对象。

    您的第一个案例不应在 new 语句处编译,因为 new 返回指向新创建对象的指针,除非有一个构造函数采用指针或重载的赋值运算符采用 handler 指针。

    在第二种情况下,它将指向新创建的对象。

    为了纠正第一种情况,

    handler myhandler=handler();
    

    如果handler 有默认构造函数或带有默认参数的构造函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多