哪种方法可以在C ++中实例化对象?

在C ++中(我使用QT)我可以通过两种方式创建一个QString类的实例:

方法1

QString str = "my string";

方法2

QString *str = new QString("my string");

我知道这是用指针做的。 所以我的问题是:

  • 两者有什么区别?
  • 我应该坚持哪种方法?
  • 什么时候使用方法1正确?何时使用方法2正确?
  • 在方法2中,我可以通过调用delete str;来销毁对象delete str; 。 如何在使用方法1时删除str变量?
  • 谢谢


  • 主要是它们有不同的生命周期:在方法2中创建的对象将生存任意长,直到你调用delete; 在方法1中,它将在堆栈上创建,并在函数调用返回时销毁(如果有的话)。 其次方法2需要更多的工作,因为不重要的内存管理。

  • 使用匹配你想要的生命期的方法。 如果方法1的生命周期足够好,不需要使用方法2,因为它需要内存管理的开销。 如果您可以重新构建程序,以便您可以使用方法1,同时改进设计,那将更加高效和优雅。

  • 见上面2.。 特别是使用方法1并存储指向该对象的指针并在其生命周期后访问它是一个陷阱。 方法2也可以这样做,但是明确的销毁会将程序员的注意力集中在它上面(但仍然是因为生命并不简单,这可能是一个陷阱)方法2的一个缺陷是忘记删除它导致内存泄漏(或删除它太早,并按照本段前面的描述提及它)

  • 在方法1中,当函数返回时,对象将被自动删除。


  • 两者是完全不同的东西。

    QString str("my string"); 创建一个自动管理其生命周期的对象:该对象要么位于其封闭作用域的末尾(如果它是局部变量),要么位于程序的末尾(如果它是全局变量)。

    new QString("my string"); 创建一个具有手动管理生命周期的对象,也称为“动态对象”(并返回指向此对象的指针)。 这意味着你负责管理对象的生命周期。 除非您正在编写库组件,否则这几乎从来都不是正确的做法。

    这就是C ++哲学的核心:C ++是图书馆写作的语言。 您拥有编写高质量,可重用组件的工具。 如果当你这样做时,你需要知道终身管理的复杂性。 但是,直到这个时候,你应该使用现有的库组件。 这样做时,你会发现几乎从不需要执行任何手动管理。

    使用动态容器(矢量,字符串,地图等)来存储数据并构建自己的数据结构。 如果您需要修改调用者范围中的对象,则通过引用传递参数。 从更简单的组件构建复杂的类。 如果您确实必须拥有动态对象,请通过unique_ptr<T>shared_ptr<T>处理程序类来处理它们。

    不要使用指针。 很少使用new ,并从不delete

    (进一步提示:1)除非用于ADL,否则不要使用using namespace 。 2)除非你正在编写库组件,否则精心设计的类不应该有析构函数,复制构造函数或赋值运算符。 如果他们这样做,将违规逻辑分解为单个责任库组件,然后参见2)。)


    当您使用第一种语法时,您正在创建名称为str对象,其类型为QString ,初始值为"my string"

    在第二个声明中,您创建了名称为str的类型为QString的指针。

    指针不保留该值,它们指向存储值的存储位置,差异很大。

    链接地址: http://www.djcxy.com/p/13805.html

    上一篇: Which is the right way to instantiate objects in C++?

    下一篇: Memory allocation areas in C++ (Stack vs heap vs Static)