自从我从 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++
最佳答案
事实上,从 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/