【问题标题】:different type of instantiating on c++c++ 上不同类型的实例化
【发布时间】:2011-01-01 13:29:57
【问题描述】:

自从我从 c# 转向 c++ 以来,c++ 中的一切对我来说都很疯狂。 我只是想知道如果有人可以解释我为什么我们在 c++ 中有这种实例化: 方法一:

ClassA obj1; // this is going to stack

方法二:

ClassA *obj1 = new ClassA(); //this is going to heap

而我们在 c++ 上没有常见的 C# 方式实例化:

ClassA  obj2 = new obj2();

还有一个在方法 1 中的问题,我从 ClassA 获得了一个实例,但没有 (),这正是我感到困惑的地方,为什么我们必须这样进行实例化? 我们的 ClassA 有一个构造函数,但实例化时没有括号??? 我们怎么叫它的构造函数?

p.s:我已经阅读了这些主题:

Different methods for instantiating an object in C++

Stack, Static, and Heap in C++

What and where are the stack and heap?

【问题讨论】:

  • C# 没有两种实例化方式,因为运行时会为您管理内存。
  • 在方法 1 中,obj 是对 ClassA 对象的引用。在方法 2 中,obj 是指向 ClassA 对象的指针。 c++ 中的 new 返回一个指向已分配内存的指针。你必须告诉 new 要创建什么类型的对象。这就是为什么第三个选项不起作用的部分原因。 obj2 尚未定义为对象。在代码中,它只是文本,一旦创建,将用作对对象的引用的标识符。

标签: c++ instantiation


【解决方案1】:

C++ 语法就是这样。如果你想使用默认构造函数,你可以这样调用它:

ClassA obj1;

如果你有一个带参数的构造函数,你可以这样调用它:

ClassA obj1(5);

【讨论】:

    【解决方案2】:

    确实,从 Java 或 C# 等语言迁移到 C++ 可能会令人生畏,我也经历过。

    第一个也是最重要的区别是,在 C++ 中,您几乎总是管理自己的内存。在堆上创建对象时,您有责任将其删除,这样它就不会泄漏内存——这反过来意味着您可以在认为合适时将其删除。在堆栈上创建对象时,它会在超出范围时自动删除 - 您必须注意不要在超出范围后使用它。

    例子:

    void do_queue(B& queue)
    {
        Evt *e = new Evt;
        queue.queueEvent(e); 
    } // all well, e can be popped and used (also must be deleted by someone else!)
    

    void do_queue(B& queue)
    {
        Evt e;
        queue.queueEvent(&e); 
    } // e is out of scope here, popping it from the queue and using it will most likely cause a sigseg
    

    话虽如此,这两种方法在一个方面也有很大不同:第一种方法是创建一个对象。第二个创建一个指向对象的指针。拥有指针的好处是您可以将它们作为参数传递,而只需在堆栈上复制最少的内存(复制的是指针,而不是整个对象)。当然,您始终可以使用“&”获取分配在堆栈上的对象的地址,或者将其作为引用传递 - 但是,当使用分配在堆栈上的对象时,您要特别注意它们的范围。

    当我从 Java 迁移到 C++ 时,我发现这个网站是一个很好的资源:@​​987654321@ - 你可能也会发现它,它提供了很多很好的解释

    【讨论】:

      【解决方案3】:

      在 C++ 中,您必须决定希望对象驻留的位置。我的意思是在哪个内存、堆栈或堆中。

      实例化一个对象是一个两步过程。首先,您需要内存,要么将它放在堆栈上,要么从堆中分配它。其次,您使用所需的值初始化内存,即通过调用其构造函数来构造对象。

      这两种语法用于这两种可能的不同内存位置:堆栈和堆。

      关于堆栈分配对象的语法和明显缺少的括号,这是为了消除对象的定义和构造以及函数的声明之间的歧义。事实上,ClassA obj(); 声明了一个不带参数的函数,并返回一个 ClassA 对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-19
        • 2023-03-19
        • 2017-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多