【问题标题】:{ } assign operator inside a constructor implementation => errors{ } 在构造函数实现中分配运算符 => 错误
【发布时间】:2017-09-27 00:20:07
【问题描述】:

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

【问题讨论】:

  • 不要使用以下划线后大写字母开头的标识符!这些是为实现(编译器和标准库)保留的。

标签: c++ constructor operators assign


【解决方案1】:

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

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

【讨论】:

  • @Sir,虽然{} 是一个统一的初始化运算符,但您知道为什么在main 中使用它与= 几乎相同,但在我的示例中却不是吗? [谢谢你的回答]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 2012-06-27
  • 1970-01-01
  • 2014-03-12
  • 2011-05-19
  • 2011-06-09
相关资源
最近更新 更多