复制(显式)初始化与直接(隐式)初始化C ++

时间:2018-08-12 17:26:33

标签: c++ variables initialization

我正在阅读变量初始化,并且遇到了三种不同的变量初始化方法:复制,直接和统一。 来源:http://www.learncpp.com/cpp-tutorial/2-1-fundamental-variable-definition-initialization-and-assignment/comment-page-1/#comments

我的问题是对基本类型使用复制与直接初始化之间有什么区别?

该网站指出:“(高级用户注意:用于复制初始化的等号是初始化语法的一部分,不被认为是在进行复制分配时使用的赋值运算符)” >

那是什么意思?难道是说'='运算符用于初始化时与在复制分配中使用时不同吗?

它还指出:“对于某些数据类型,直接初始化的性能要比复制初始化好,一旦我们开始讨论类,它还会带来其他好处。它还有助于区分初始化和赋值。因此,我们建议使用直接初始化复制初始化。”

有人可以帮我帮忙清理一下,并用简单的术语解释一下吗?谢谢

1 个答案:

答案 0 :(得分:1)

对于基本类型,复制初始化与直接初始化完全相同。对于具有构造函数的更复杂的类型,除非将拷贝构造函数标记为=,否则复制初始化与使用explicit之后的值调用复制构造函数相同。

一些示范:

#include <iostream>

struct bar
{
    int x;
    bar() : x(30) {}
};

struct foo
{
    int x;
    foo() : x(42) { std::cout << "Default constructor\n"; }
    foo(const foo &other) : x(other.x) { std::cout << "Copy constructor\n"; }
    foo(const int &y) : x(y) { std::cout << "Copy/conversion constructor with int\n"; }
    explicit foo(const bar &y) : x(y.x) { std::cout << "Copy/conversion constructor with bar\n"; }
    foo& operator=(const foo &other)
    {
        std::cout << "Copy assignment operator\n";
        x = other.x;
        return *this;
    }
};

int main() {
    foo a; //calls default constructor
    foo w; //calls default constructor
    w = a; //then the assignment operator
    foo b = a; //calls copy constructor, not copy assignment operator, different from previous
    foo c(a); //also calls copy constructor, same as previous
    foo d = 10; //same as foo d(10), constructor that takes an int can be used for conversions
    bar h;
    foo j(h); //calls copy/conversion constructor that takes a bar,
              //the contructor can also be used for explicit conversions
    //foo k = h; //error because of implicit conversion when constructor is marked explicit
    return 0;
}

如演示中所示,初始化中的=与分配中的=不同。我不确定它们在性能方面的含义,因为复制初始化通常与直接初始化相同,并且调用相同的构造函数。