{}在构造函数内部赋值运算符implementation =>错误
问题描述:
{}运算符是否为赋值运算符?另外,为什么int val{10};
在main里面工作,但是构造函数中的赋值语句是非法的?{}在构造函数内部赋值运算符implementation =>错误
检查例子
此代码:
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中,类成员的初始化在构造函数中语句的执行之前发生。
它在你的第一个例子中工作的原因是因为=
是一项任务。 _H={h};
将调用赋值运算符。但_H{h};
是无效的C++语法。而_H(h);
,我相信是你根据错误信息将尝试调用函数_H
。
+0
@Sir,虽然'{}'是一个统一的初始化操作符,你知道为什么它在main中的使用与'='接近吗?但在我的例子中,它不是? [谢谢你的回答] – Homunculus
+1
查看更新的答案。 –
请勿使用以下划线和大写字母开头的标识符!这些保留用于实现(编译器和标准库)。 – aschepler