我正在观看MVA(Microsoft Visual Academy)的教程,我遇到了这两个运算符,即{}
和=
,将值传递给变量。我已经完成了C编程,所以我非常了解赋值运算符=
。但{}
不是我到目前为止所用的任何语言。
Kate正在教授C ++课程,因此她告诉{}
用于复制。
但是我在下面的类中使用了运算符{}
,当我尝试这样做时它显示了一些错误:
this->_width{new_width};
而下面的一个有效:
this->_width = new_width;
为什么这样?我也使用{}
在构造函数中传递值,但它们完美地工作。唯一的问题是会员功能。
class Rectangle
{
public:
void resize(int new_height, int new_width) { this->_width{new_width ; this->_height{new_height}; //member function
Rectangle(): _width{} , height{} {} //constructor
private:
int _width;
int _height;
};
答案 0 :(得分:5)
{}
可以用来初始化c ++ 11中的变量,就像它们用来初始化c中的数组和结构一样。
这主要是为了提供语言语法的一致性(使用{}
进行初始化将适用于所有上下文,而使用赋值运算符初始化或()
将在特定上下文中起作用。
列出初始化还有一个优点,它可以阻止narrowing
- 即它可以防止您在需要double时提供整数,或者在需要整数时提供short。通过这种方式,它可以帮助减少错误。
请注意,{}
不能用于将值传递给函数 - 仅用于构造新对象。
以上链接非常值得一读(此处重复) http://en.cppreference.com/w/cpp/language/list_initialization
答案 1 :(得分:1)
非静态数据成员可以通过以下两种方式之一进行初始化:
1)在构造函数的成员初始化列表中。
struct S {
int n;
std::string s;
S() : n(7) // direct-initializes n, default-initializes s
{ }
};
2)通过大括号或类似的初始值设定项,它只是成员声明中包含的初始值设定项,如果在成员初始值设定项列表中省略了该成员,则使用该初始值设定项
struct S {
int n = 7;
std::string s{'a', 'b', 'c'};
S() // copy-initializes n, list-initializes s
{ }
};
您可以在成员声明中使用大括号初始值设定项。
另外,根据标准,N4296,§9.2,第4段:
支撑或等于初始化器只出现在声明中 数据成员。
答案 2 :(得分:0)
在此上下文中,使用{}
称为统一初始化。它的介绍主要有两个原因。
首先,正如名称所示,初始化是统一的,即它对单个对象,数组,接受初始化列表的容器等的外观和工作方式相同。
其次,同样重要的是,使用花括号不可能得到most vexing parse,否则很有可能无意中:
A a(); // What does this do? What was probably intended?
B b{}; // And what does this do?
另外,作为奖励(对@Richard Hodges的称赞),您可以避免使用统一初始化缩小转换范围。
要回答问题"我应该使用哪一个?",你应该优先使用{}
,因为它只有优点,没有缺点(另外,Bjarne Stroustrup建议使用它)