【问题标题】:Different methods for instantiating an object in C++在 C++ 中实例化对象的不同方法
【发布时间】:2010-10-15 05:25:31
【问题描述】:

这有什么区别:

Myclass *object = new Myclass();

Myclass object = new Myclass();

我看到很多 C++ 库,如 wxWidgets、OGRE 等都使用第一种方法...为什么?

【问题讨论】:

  • 第二行没有new关键字有效..Myclass object = Myclass();。查看this question了解更多详情。
  • 第二个是错误的 C++ 代码但有效的 Java 代码,其中所有对象都表示为引用。

标签: c++ object


【解决方案1】:
Myclass *object = new Myclass(); //object has dynamic storage duration (usually is on the heap)
Myclass object; //object has automatic storage duration (usually is on the stack)

如果您计划在很长一段时间内使用它们并创建具有自动存储持续时间(通常在堆栈上)且生命周期很短(或范围)的对象,您将创建具有动态存储持续时间(通常在堆上)的对象.

【讨论】:

  • 我只是想添加与上述类似的问题:这两者有什么区别: Myclass *obj = new Myclass() ;和 Myclass *obj = new Myclass;请解释一下,因为我找不到区别。
  • @ChandraShekharRam 没有区别。他们都调用了默认构造函数
  • 非常感谢您的解释
  • 只是为了巩固我对类构造函数的理解,为什么不能写Myclass object();
  • 从技术上讲,这两种形式的区别不是“堆”与“栈”。规范没有说明它们必须存储在哪里。第一个具有动态存储持续时间;第二个有自动存储期限
【解决方案2】:

第二个错了!

你可以使用

MyClass object;

这会起作用的。

现在,关于如何在这两种可能性之间进行选择,主要取决于您的对象应该存在多长时间。请参阅there 以获得详尽的答案。

【讨论】:

    【解决方案3】:

    您的第一行是 100% 正确的。不幸的是,你不能用 C++ 中的第二行来创建对象。在 c++ 中有两种方法可以创建/创建对象。

    第一个是:

    MyClass myclass; // if you only need to call the default constructor    
    MyClass myclass(12); // if you need to call constructor with parameters*
    

    第二个是:

    MyClass *myclass = new MyClass();// if you only need to call the default constructor
    MyClass *myclass = new MyClass(12);// if you need to call constructor with parameters
    

    在 C++ 中,如果你使用 new 关键字,对象将存储在堆中。如果您长时间使用该对象,并且使用第一种方法,它将非常有用,它将存储在堆栈中。它只能在很短的时间内使用。 注意:如果你使用new关键字,记住它会返回指针值。您应该使用* 声明名称。 如果您使用第二种方法,它不会删除堆中的对象。您必须使用delete关键字自行删除:

    delete myclass;
    

    【讨论】:

    • -1:从技术上讲,它不是堆与堆栈,而是动态与自动存储持续时间。这也不是关于“长时间”与“短”的使用。一个只能在作用域内使用,另一个永远不会被自动删除。
    • 我猜你在说同样的事情。参考:craftofcoding.wordpress.com/2015/12/07/…
    • 当进程需要内存时,通过使用 brk() 或 sbrk() 系统调用向前移动堆的上限来创建一些空间。因为系统调用在 CPU 使用方面的开销很大,所以更好的策略是调用 brk() 来获取大块内存,然后根据需要将其拆分以获得更小的块。这正是 malloc() 所做的。它将许多较小的 malloc() 请求聚合到较少的大型 brk() 调用中。参考:linuxjournal.com/article/6390
    【解决方案4】:

    new 运算符返回一个指向它创建的对象的指针,因此表达式 Myclass object = new Myclass(); 无效。

    其他语言没有像 C++ 这样的显式指针,因此您可以编写像 Myclass object = new Myclass(); 这样的语句,但在 C++ 中这是不可能的。 new Myclass(); 的返回类型是指向Myclass 对象的指针,即Myclass *

    【讨论】:

    • 感谢您的澄清。我不知道 new 运算符返回指向对象的指针。
    【解决方案5】:

    第一个示例创建一个指向 MyClass 的指针并将其初始化为指向 new 运算符的结果。

    第二个可能无法编译,因为它试图创建一个 MyClass 对象并将其分配给一个 MyClass 指针。如果您有一个接受 MyClass 指针的 MyClass 构造函数,这可能会起作用。

    【讨论】:

      【解决方案6】:

      您的第一行代码正确,而第二行代码不正确。

      Myclass object=new Myclass();  //Incorrect code
      

      上述代码不正确,因为 new Myclass(); 返回指向类的指针,而 Myclass 对象; 声明了类的对象,而您正试图将指向类的指针分配给类的对象,这是不正确的。

      您的第一行代码是正确的。但这声明了指向类的指针而不是类的对象。

      Myclass *object = new Myclass();  //declares pointer to class.
      

      要声明类的对象,您应该编写以下代码。

      Myclass object;   //declares object of class Myclass
      

      但是你应该注意,使用类指针访问类成员和使用类对象访问类成员的方式是不同的。以下是访问类成员的代码。

      pointer_to_class->member;  // accessing class member using pointer to class
      object.member;             //accessing class member using object of class 
      

      【讨论】:

      • 没有“指向类的指针”这样的东西。使用您的说法,它更像是“指向类对象的指针”,但请注意,指针也是对象。
      【解决方案7】:

      第一个是正确的。

      第二个一般不会编译。如果它确实编译了,那么这个类就会在构造函数/赋值运算符中做一些复杂的事情。而且很可能是内存泄漏。

      【讨论】:

        【解决方案8】:

        它的可能 我的类名 = Myclass();

        【讨论】:

        • 这不是问题的答案。
        猜你喜欢
        • 2020-05-18
        • 2016-09-19
        • 2011-11-15
        • 2018-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-28
        • 1970-01-01
        相关资源
        最近更新 更多