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

时间:2015-01-03 12:09:29

标签: c++

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

}; 

3 个答案:

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