c+上的不同实例化类型+; 自从我从C++到C++,在C++中,一切看起来都很疯狂。 我只是想知道有人能解释一下为什么我们在C++中有这样的实例化: 方法1: ClassA obj1; // this is going to stack
方法2: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++语法就是这样。如
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尚未定义为对象。在代码中的这一点上,一旦创建了一个对象,它只是作为引用标识符的文本。