因为我已经从C#来C ++的一切看起来都疯了,我在C ++中。 我只是想知道,如果有人能解释我为什么我们这些种在C ++中实例化的: 方法1:

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的,但没有(),这是确切的地方我有困惑,为什么我们要instatiating这样得到一个实例? 我们ClassA的有一个构造函数,但不带括号实例???  为什么我们调用它的构造?

P.S:我读过这些主题:

不同的方法用于实例化在C ++ <对象/ p>

堆栈,静态,并且堆在C ++

什么,在哪里是堆栈和堆?

有帮助吗?

解决方案

实际上移动到C ++从如Java或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 ++中,你必须决定你想要你的对象驻留。通过其中I是指其中存储器,堆栈,或堆。

实例化的对象是一个两个步骤的过程。首先,你需要内存,你不把它在栈上,或者你从堆中分配它。第二,通过调用其构造函数初始化与需要的值,即,在构造对象,存储器

这两个语法是这些两种可能的不同的存储位置:堆栈,堆

关于语法和堆栈分配的对象的明显缺失括号,它是定义和对象的结构,并且函数的声明之间的歧义。事实上,ClassA obj();声明的函数采取任何参数,并且返回一个ClassA的对象。

C ++语法就是如此。如果您想使用默认的构造函数,你只需要调用它像:

ClassA obj1;

如果你有一个参数的构造函数,你会说它是这样的:

ClassA obj1(5);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top