2

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

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 有一个构造函数,但实例化时没有括号???我们怎么叫它的构造函数?

ps:我已经阅读了这些主题:

在 C++ 中实例化对象的不同方法

C++ 中的堆栈、静态和堆

堆栈和堆是什么以及在哪里?

4

3 回答 3

3

事实上,从 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/ - 你可能也会发现它,它提供了很多很好的解释

于 2010-01-05T08:29:06.603 回答
2

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

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

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

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

于 2010-01-05T08:29:54.703 回答
1

C++ 语法就是这样。如果要使用默认构造函数,只需像这样调用它:

ClassA obj1;

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

ClassA obj1(5);
于 2010-01-05T08:22:11.227 回答