首先,在调用类的构造函数之后,对构造函数使用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。
2条答案
按热度按时间elcex8rz1#
声明
Foo f(1, 2, 3);
构造Foo
名为的对象f
通过直接初始化。在c17之前,语句
Foo f = Foo(1, 2, 3);
创建临时Foo
对象,然后复制f
通过复制初始化从该临时对象中删除。自从c17以来,这两个语句之间没有区别。由于有保证的副本省略,声明
Foo f = Foo(1, 2, 3);
被视为等同于Foo f(1, 2, 3);
,避免创建任何临时Foo
对象。guz6ccqo2#
首先,在调用类的构造函数之后,对构造函数使用new操作符将返回为所创建示例分配的内存的地址。
所以:
Foo f = new Foo(1, 2, 3);
与c++中的不同:但您可以按如下方式调用新运算符:关于你问题的第一部分:我认为不同之处在于建造步骤的顺序。
Foo f(1, 2, 3)
:这里,直接构建f示例。Foo f = Foo(1, 2, 3)
:在示例构建中有不同的步骤:首先,创建一个临时示例并调用构造函数;其次,通过调用操作符将这个临时示例分配给f=这就像是在问:
int x = 5
; =>这里5是直接赋值和int x = 2+3;
=>首先执行2+3,然后将结果分配给x。