c+上的不同实例化类型+; 自从我从C++到C++,在C++中,一切看起来都很疯狂。 我只是想知道有人能解释一下为什么我们在C++中有这样的实例化: 方法1: ClassA obj1; // this is going to stack

c+上的不同实例化类型+; 自从我从C++到C++,在C++中,一切看起来都很疯狂。 我只是想知道有人能解释一下为什么我们在C++中有这样的实例化: 方法1: ClassA obj1; // this is going to stack,c++,instantiation,C++,Instantiation,方法2: ClassA *obj1 = new ClassA(); //this is going to heap < > >我们在C++上没有C语言中常见的实例化: ClassA obj2 = new obj2(); 在method1中还有一个问题,我从ClassA中得到了一个实例,但是没有(),这正是我所困惑的地方,为什么我们必须这样进行恢复? 我们的ClassA有一个构造函数,但没有括号进行实例化??? 为什么我们称它为构造函数 p、 s:我读过以下主题: C++语法就是这样。如

方法2:

ClassA *obj1 = new ClassA(); //this is going to heap
< > >我们在C++上没有C语言中常见的实例化:

ClassA  obj2 = new obj2();
在method1中还有一个问题,我从ClassA中得到了一个实例,但是没有(),这正是我所困惑的地方,为什么我们必须这样进行恢复? 我们的ClassA有一个构造函数,但没有括号进行实例化??? 为什么我们称它为构造函数

p、 s:我读过以下主题:


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

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

ClassA obj1(5);

确实,从java或C++语言中移动到C++是令人畏惧的,我也经历过。p> 第一个和最重要的区别是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++时,我发现这个网站是一个很好的资源:你也可能找到它,C++提供了很多很好的解释

,你必须决定你的对象要驻留在哪里。这里我指的是哪个内存、堆栈或堆

实例化对象是一个分两步的过程。首先,您需要内存,要么在堆栈上获取内存,要么从堆中分配内存。第二,使用所需的值初始化内存,即通过调用其构造函数来构造对象

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


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

C#没有两种实例化方法,因为运行时为您管理内存。在方法1中,obj是对ClassA对象的引用。在方法2中,obj是指向ClassA对象的指针。C++中的新返回指向分配内存的指针。您必须告诉new要创建什么类型的对象。这也是第三种选择不起作用的部分原因。obj2尚未定义为对象。在代码中的这一点上,一旦创建了一个对象,它只是作为引用标识符的文本。