我应该使用哪一个以及为什么:{} vs = in c ++

heh*_*ehe 1 c++

我正在观看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)

Ric*_*ges 6

{} 可以用来初始化c ++ 11中的变量,就像它们用来初始化c中的数组和结构一样.

这主要是为了提供语言语法的一致性(初始化{}将在所有上下文中工作,而使用赋值运算符初始化或()将在特定上下文中工作).

列出初始化还有一个优点,narrowing即它可以防止- 即它阻止您在需要double时提供整数,或者在需要整数时提供short.通过这种方式,它可以帮助减少错误.

请注意,{}不能用于将值传递给函数 - 仅用于构造新对象.

上面的链接值得一读(在此重复) http://en.cppreference.com/w/cpp/language/list_initialization

  • @Yakk `f({3})` 之所以有效,是因为圆括号引入了一个已由大括号初始化的整数。大括号正在初始化,而不是将值传递给函数。该断言成立,因为它与 C++ 标准一致。 (3认同)

Dam*_*mon 5

在这种情况下,使用{}称为统一初始化。引入它主要有两个原因。

首先,正如名称所示,初始化是统一的,也就是说,对于单个对象、数组、接受初始化列表的容器等,它的外观和工作方式都是相同的。

其次,同样重要的是,使用大括号不可能获得最令人烦恼的解析,否则很可能是无意的:

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 建议使用它)。

  • 但请注意具有 `std::initializer_list` 重写的构造函数,例如 `std::string s{10, 'a'}` - 这与 `std::string s(10, 'a') 有很大不同`!我实际上不确定如何在不使用 `()` 的情况下调用这个构造函数 - 有人知道吗? (2认同)