哪种方式更适合为类调用复制构造函数?

Which way is preferred to call copy constructor for a class?

提问人:Mantosh Kumar 提问时间:3/14/2023 更新时间:3/14/2023 访问量:127

问:

下面是用 c++ 中的复制构造函数编写的示例类。

class Foo {
public:
    Foo()   { std::cout << "Foo::Foo\n";}
    ~Foo()   { std::cout << "Foo::Foo\n";}
    Foo(const Foo& rhs) {
        std::cout << "cctor\n";
    }

    Foo& operator=(const Foo& rhs) {
        if (&rhs == this) return *this;
        std::cout << " operator =\n";
        return *this;
    }

    void bar() { std::cout << "Foo::bar\n";}
};

现在我们可以用几种方式编写,这些方式将调用类的复制构造函数。

Foo x;
Foo y;
Foo z = x;     // This calls copy constructor
Foo a(z);      // This also calls copy constructor

那么,在两种风格中,哪一种是首选,对此有什么解释吗?或者这两者更多的是开发人员的风格偏好。

C++ 复制构造函数

评论

1赞 Yksisarvinen 3/14/2023
在 C++ 中,有大量关于初始化的巨著,但对于常规使用,您可能不会注意到任何差异。就个人而言,我更喜欢或统一初始化。Foo z = x;Foo a{z};
0赞 user12002570 3/14/2023
Foo z = x;是复制初始化与直接初始化。如果您了解两者之间的区别,您将能够决定哪种情况适合。在 c++ 中,没有人适合所有人Foo A(z);
0赞 Mikhail 3/14/2023
这个问题比你想象的要深。请从这个演讲开始:youtu.be/ZfP4VAK21zc
0赞 Bruno Hendrickx 3/14/2023
第一个是复制构造函数,但第二个是复制分配。这里没有对错之分,这完全取决于上下文。请注意,对于大多数类,即那些不管理不可复制事物的类,您可以利用 0/3/5 规则。Foo(const Foo& rhs)Foo& operator=(const Foo& rhs)
1赞 Pete Becker 3/14/2023
@BrunoHendrickx -- 您的评论是正确的,但请注意,问题的代码中没有赋值。 构造一个对象,因此它使用 Copy 构造函数。它不使用赋值运算符,即使它有该符号。Foo z = x;=

答:

1赞 user12002570 3/14/2023 #1

在两种风格中,哪一种是首选

Foo z = x;是复制初始化与直接初始化。如果您了解两者之间的区别,您将能够决定哪种情况适合。在 c++ 中,没有人适合所有人。询问哪个是首选的假设其中一个“总是”优于另一个,但实际上并非如此。根据上下文,一个可能比另一个更受欢迎。Foo A(z);

例如,即使复制构造函数是显式的,直接初始化也会起作用,而复制初始化则不起作用。在执行复制初始化的隐式转换中,不会使用显式复制 ctor。