java—在c++中创建类示例的两种方法有什么区别?

jm81lzqq  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(355)

这个问题在这里已经有了答案

c++中初始化对象的不同方法(1个答案)
19天前关门了。
假设我有一个班级叫 Foo ,它具有参数化构造函数 Foo(int a, int b, int c) .
这两种创建示例的方法有什么区别 Foo ?

Foo f = Foo(1, 2, 3);

Foo f(1, 2, 3);

我知道在java中它只是:

Foo f = new Foo(1, 2, 3);
elcex8rz

elcex8rz1#

声明 Foo f(1, 2, 3); 构造 Foo 名为的对象 f 通过直接初始化。
在c17之前,语句 Foo f = Foo(1, 2, 3); 创建临时 Foo 对象,然后复制 f 通过复制初始化从该临时对象中删除。
自从c
17以来,这两个语句之间没有区别。由于有保证的副本省略,声明 Foo f = Foo(1, 2, 3); 被视为等同于 Foo f(1, 2, 3); ,避免创建任何临时 Foo 对象。

guz6ccqo

guz6ccqo2#

首先,在调用类的构造函数之后,对构造函数使用new操作符将返回为所创建示例分配的内存的地址。
所以: Foo f = new Foo(1, 2, 3); 与c++中的不同:但您可以按如下方式调用新运算符:

Foo* f = new Foo(1, 2, 3);

关于你问题的第一部分:我认为不同之处在于建造步骤的顺序。 Foo f(1, 2, 3) :这里,直接构建f示例。 Foo f = Foo(1, 2, 3) :在示例构建中有不同的步骤:首先,创建一个临时示例并调用构造函数;其次,通过调用操作符将这个临时示例分配给f=
这就像是在问: int x = 5 ; =>这里5是直接赋值和 int x = 2+3; =>首先执行2+3,然后将结果分配给x。

相关问题