{ } 在构造函数实现中赋值运算符 => 错误
{ } 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
.
{} 运算符不是赋值运算符吗?另外,为什么 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
.