这种语法是什么意思?
date aaa(2011,7,1);
而不是aaa我可以使用我想要的任何东西(例如bbb
或ccc
)。看起来我创建了一个名为aaa
的新对象,属于类date
。但就我所知,我需要使用new
关键字来创建一个新对象。
答案 0 :(得分:7)
这意味着“通过调用data
的构造函数创建一个名为aaa
的{{1}}实例,该构造函数接受三个整数参数(或可以从int隐式构造的参数)”。< / p>
在C ++中,不需要date
关键字来创建对象。 new
实例化动态存储中的对象并返回指向它的指针。除此之外,它意味着您(或某人,某处)必须承担在某些时候删除对象的责任。
答案 1 :(得分:5)
int x;
我确定您明白这定义了一个名为int
的{{1}}对象。你使用x
了吗?如果我们添加复制初始化怎么样:
new
这定义了一个名为int x = 5;
的{{1}}对象,并将其初始化为5.使用直接初始化可以实现相同的结果:
int
那么:
x
这与上面的语法完全相同。我们正在创建一个名为int x(5);
的{{1}}类型的对象,这次我们将三个参数传递给它的构造函数。
所有这些定义的共同之处在于,它们使用自动存储持续时间创建某种类型的对象。这意味着对象将在其范围的末尾被销毁。
现在考虑以下一行:
data aaa(2011,7,1);
这会创建两个对象。第一个是名为data
的{{1}}。 aaa
具有自动存储持续时间,如上所述,并将在其范围的末尾销毁。然后,我们使用int* p = new int(5);
返回的指针初始化该对象。此new-expression创建一个int*
对象,初始化为5,动态存储持续时间。这意味着它不会在其范围的末尾自动销毁,但需要p
d。
因此,简而言之,这些是创建对象的两种不同方式,可以为它们提供不同的存储持续时间。
答案 2 :(得分:1)
在某些语言类似到C ++中,您可能需要new
来创建对象,例如Java。但是在C ++中,你没有拥有 to。
在C ++中,您使用new
在堆上创建新对象 ,例如,如果您需要在运行时动态创建一个对象。如果声明一个变量(例如示例中的变量),则它将在堆栈上创建,如果它是函数内的局部变量。只要它们的范围持续,这些对象才可用。
答案 3 :(得分:0)
new运算符在 heap 内存中实例化一个对象,该对象一直存在,直到调用delete。在您的示例中,对象在堆栈中实例化,并且仅存在于范围内(直到下一个}
)。