gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:23:27 25 4
gpt4 key购买 nike

自从我从 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?

最佳答案

确实,从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com