【问题标题】:What's the difference between the two ways to create an instance of a class in C++? [duplicate]在 C++ 中创建类的实例的两种方法有什么区别? [复制]
【发布时间】:2020-12-21 07:44:23
【问题描述】:

假设我有一个名为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);

【问题讨论】:

标签: java c++ class oop constructor


【解决方案1】:

语句Foo f(1, 2, 3); 通过direct initialization 构造一个名为fFoo 对象。

在 C++17 之前,语句 Foo f = Foo(1, 2, 3); 通过直接初始化创建一个临时的 Foo 对象,然后通过 copy initialization 从该临时对象复制构造 f 对象.

C++17 以来,这两个语句之间没有区别。由于保证了copy elision,声明Foo f = Foo(1, 2, 3);Foo f(1, 2, 3); 被处理相同,避免创建任何临时Foo 对象。

【讨论】:

    【解决方案2】:

    首先,在构造函数中使用new操作符会在调用类的构造函数后返回为创建的实例分配的内存地址。

    所以:Foo f = new Foo(1, 2, 3); 在 C++ 中是不一样的:但是您可以按如下方式调用 new 运算符:

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

    对于您问题的第一部分:我认为不同之处在于构建步骤的顺序。 Foo f(1, 2, 3) :这里直接构建f实例。 Foo f = Foo(1, 2, 3) :这里在实例构建中有不同的步骤: 首先,创建一个临时实例并调用构造函数 其次,通过调用 operator=

    将这个临时实例分配给 f

    这就像问有什么区别: int x = 5; =>这里5是直接赋值 而int x = 2+3; => 先执行2+3,然后将结果赋值给x。

    【讨论】:

    • 我认为不同之处在于构建步骤的顺序。”-您所描述的在 C++17 之前是正确的。但是在 C++17 中,规则发生了变化,所以 Foo f(1,2,3)Foo f = Foo(1,2,3)相同的。 “这个临时实例是通过调用 operator= 分配给 f 的——这是完全错误的。 f 对象是通过将临时值传递给 Foo 的复制构造函数而不是其赋值运算符来构造的。
    • 关于 copy-ctor 调用你是对的!
    猜你喜欢
    • 1970-01-01
    • 2013-06-15
    • 2012-10-21
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多