我正在观看MVA(微软视觉学院)的教程,我遇到了这两个运算符{},=即将值传递给变量.我已经完成了C编程,所以我非常了解赋值运算符=.但是{}到目前为止我没有用过任何语言.
凯特正在教授C++课程,所以她说这{}是用于复制的.
但是我{}在下面的类中使用了运算符,当我尝试这样做时它显示了一些错误:
this->_width{new_width};
Run Code Online (Sandbox Code Playgroud)
而下面一个工作:
this->_width = new_width;
Run Code Online (Sandbox Code Playgroud)
为什么这样?我也{}用于在构造函数中传递值,但它们完美地工作.唯一的问题是会员功能.
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;
};
Run Code Online (Sandbox Code Playgroud)
{} 可以用来初始化c ++ 11中的变量,就像它们用来初始化c中的数组和结构一样.
这主要是为了提供语言语法的一致性(初始化{}将在所有上下文中工作,而使用赋值运算符初始化或()将在特定上下文中工作).
列出初始化还有一个优点,narrowing即它可以防止- 即它阻止您在需要double时提供整数,或者在需要整数时提供short.通过这种方式,它可以帮助减少错误.
请注意,{}不能用于将值传递给函数 - 仅用于构造新对象.
上面的链接值得一读(在此重复) http://en.cppreference.com/w/cpp/language/list_initialization
在这种情况下,使用{}称为统一初始化。引入它主要有两个原因。
首先,正如名称所示,初始化是统一的,也就是说,对于单个对象、数组、接受初始化列表的容器等,它的外观和工作方式都是相同的。
其次,同样重要的是,使用大括号不可能获得最令人烦恼的解析,否则很可能是无意的:
A a(); // What does this do? What was probably intended?
B b{}; // And what does this do?
Run Code Online (Sandbox Code Playgroud)
另外,作为奖励(感谢@Richard Hodges),您可以避免使用统一初始化来缩小转换范围。
要从字面上回答“我应该使用哪一个?”这个问题,您应该优先使用它,{}因为它只有优点,没有缺点(另外,Bjarne Stroustrup 建议使用它)。