我正在阅读变量初始化,并且遇到了三种不同的变量初始化方法:复制,直接和统一。 来源:http://www.learncpp.com/cpp-tutorial/2-1-fundamental-variable-definition-initialization-and-assignment/comment-page-1/#comments
我的问题是对基本类型使用复制与直接初始化之间有什么区别?
该网站指出:“(高级用户注意:用于复制初始化的等号是初始化语法的一部分,不被认为是在进行复制分配时使用的赋值运算符)” >
那是什么意思?难道是说'='运算符用于初始化时与在复制分配中使用时不同吗?
它还指出:“对于某些数据类型,直接初始化的性能要比复制初始化好,一旦我们开始讨论类,它还会带来其他好处。它还有助于区分初始化和赋值。因此,我们建议使用直接初始化复制初始化。”
有人可以帮我帮忙清理一下,并用简单的术语解释一下吗?谢谢
答案 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;
}
如演示中所示,初始化中的=
与分配中的=
不同。我不确定它们在性能方面的含义,因为复制初始化通常与直接初始化相同,并且调用相同的构造函数。