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

C++ 复制(显式)初始化与直接(隐式)初始化C++;,c++,variables,initialization,C++,Variables,Initialization,我在阅读有关变量初始化的内容时,遇到了三种不同的初始化变量的方法:复制、直接和统一。 资料来源: 我的问题是,对基本类型使用复制和直接初始化有什么区别 该网站声明,“(高级用户注意:此处用于复制初始化的等号是初始化语法的一部分,不被视为使用在执行复制赋值时调用的赋值运算符)” 这是什么意思?是不是说用于初始化的“=”运算符与用于复制分配的运算符不同 此外,它还指出,“对于某些数据类型,直接初始化可以比复制初始化执行得更好,而且一旦我们开始讨论类,还会带来一些其他好处。它还有助于区分初始化和赋值。

我在阅读有关变量初始化的内容时,遇到了三种不同的初始化变量的方法:复制、直接和统一。 资料来源:

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

该网站声明,“(高级用户注意:此处用于复制初始化的等号是初始化语法的一部分,不被视为使用在执行复制赋值时调用的赋值运算符)”


这是什么意思?是不是说用于初始化的“=”运算符与用于复制分配的运算符不同

此外,它还指出,“对于某些数据类型,直接初始化可以比复制初始化执行得更好,而且一旦我们开始讨论类,还会带来一些其他好处。它还有助于区分初始化和赋值。因此,我们建议使用直接初始化而不是复制初始化。”


有人能帮我把事情弄清楚,用更简单的术语解释一下吗?感谢使用原语类型,复制初始化与直接初始化完全相同。对于具有构造函数的更复杂类型,复制初始化与使用
=
后面的值调用复制构造函数是一样的,除非该复制构造函数标记为
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;
}
#包括
结构条
{
int x;
bar():x(30){}
};
结构foo
{
int x;

foo():x(42){std::cout
=
符号用于初始化时根本不意味着调用
=
运算符。因此,最好不要使用复制初始化语法。“这是说用于初始化时的“=”运算符与用于复制分配时的“=”运算符不同吗?”-是的。你的C++教科书应该详细地介绍这个。谢谢你解释得更好。