{ } 在构造函数实现中赋值运算符 => 错误

{ } assign operator inside a constructor implementation => errors

{} 运算符不是赋值运算符吗?另外,为什么 int val{10}; 在 main 中有效,但构造函数中的赋值是非法的?

查看示例

此代码有效:

class Time{
    int _H, _M, _S;
public:
    Time(int h = 0, int m = 0, int s = 0){_H={h};
                                          _M={m}; 
                                          _S={s};};
    ~Time(){}

};

这不是:

class Time{
    int _H, _M, _S;
public:
    Time(int h = 0, int m = 0, int s = 0){_H{h};  //here is the difference
                                          _M{m}; 
                                          _S{s};};
    ~Time(){}

};

我从 GCC 收到的消息是这个

classes.cpp: In constructor ‘Time::Time(int, int, int)’:
classes.cpp:48:44: error: expression cannot be used as a function
  Time(int h = 0, int m = 0, int s = 0){_H{h};
                                            ^
classes.cpp:49:16: error: expected ‘;’ before ‘{’ token
              _M{m}; 
                ^
classes.cpp:50:16: error: expected ‘;’ before ‘{’ token
              _S{s};};
                ^

{} 不是赋值运算符。是统一初始化。这是正确的方法,

class Time{
    int _H, _M, _S;
public:
    Time(int h = 0, int m = 0, int s = 0):_H{h},
                                         _M{m}, 
                                         _S{s}{}
    ~Time(){}
};

之所以更好,是因为在 C++ 中,不像 C# 或 Java,class 成员的初始化发生在构造函数内部的语句执行之前。

它在你的第一个例子中起作用的原因是因为 = 是一个赋值。 _H={h}; 将调用赋值运算符。但是 _H{h}; 不是有效的 C++ 语法。 _H(h); 我相信这是你根据错误消息所拥有的将尝试调用函数 _H.