c++ - C++ 上不同类型的实例化

标签 c++ instantiation

自从我从 C# 转向 C++ 以来,C++ 中的一切对我来说看起来都很疯狂。 我只是想知道是否有人可以解释一下为什么我们在 C++ 中进行此类实例化: 方法一:

ClassA obj1; // this is going to stack

方法2:

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

而我们在 C++ 上没有以 C# 方式进行常见实例化:

ClassA  obj2 = new obj2();

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

附:我已阅读这些主题:

Different methods for instantiating an object in C++

Stack, Static, and Heap in C++

What and where are the stack and heap?

最佳答案

事实上,从 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++ 时,我发现这个网站是一个很棒的资源:http://www.parashift.com/c++-faq-lite/ - 你可能也会找到它,它提供了很多很好的解释

关于c++ - C++ 上不同类型的实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2004743/

相关文章:

c++ - 在没有中间光栅的情况下在 OpenGL 中显示 SVG

c++ - 模板:在运行时从非类型化参数实例化(并引用)?

groovy - 在 groovy 的 repl 中使用 def 的奇怪行为 (groovysh)

c++ - 运行时错误检查/RTC

c++ - 文件输入/输出是否需要二进制标志?

c++ - 在不知道值类型的情况下从前向迭代器获取反向迭代器

c++ - 检索 STL 映射键

testing - Java 实例化抽象类或部分实现的接口(interface)

使用 __new__ 来自现有对象的 Python 对象

c# - Unity销毁实例化克隆停止实例化