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

时间:2017-09-27 00:20:08

标签: c++ constructor operators assign

{}运算符不是赋值运算符吗?另外,为什么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};};
                ^

1 个答案:

答案 0 :(得分:2)

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

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,类成员的初始化发生在构造函数内部执行语句之前。

它在您的第一个示例中起作用的原因是因为=是一项任务。 _H={h};将调用赋值运算符。但_H{h};不是有效的C ++语法。我认为基于错误消息的_H(h);将尝试调用函数_H