看到以下代码片段,我有一些问题需要了解它是如何工作的。
class Month {
public:
static const Month Jan() { return 1; }
...
static const Month Dec() { return 12; }
int asInt() const { return monthNumber; }
private:
Month(int number) : monthNumber(number) {}
const int monthNumber;
}
该类是以这种方式设计的,因此用户不会获得无效的月份值。
以下是问题: 为什么静态函数Jan可以返回1,返回值为Month?
谢谢
根据评论,这个类可以设计如下:
class Month {
public:
static const Month Jan() { return Month(1); }
...
static const Month Dec() { return Month(12); }
int asInt() const { return monthNumber; }
private:
explicit Month(int number) : monthNumber(number) {}
const int monthNumber;
};
答案 0 :(得分:12)
使用Month
构造函数自动创建Month(int)
对象。它应该/应该以这种方式写成明确的:
static const Month Jan() { return Month(1); }
请注意,良好做法是声明将一个参数作为explicit
的构造函数。实际上,正如您对代码所经历的那样,这些构造函数可用于执行类型转换。好的做法是明确声明这些构造函数,以便不会发生这种自动转换。它会强迫你像我一样写它。
答案 1 :(得分:1)
因为您没有将构造函数标记为“显式”,所以它可以在隐式转换操作中使用。
答案 2 :(得分:0)
我认为构造函数正在隐式转换中使用。
IE中。构造函数可以从整数创建Month对象。编译器会自动使用它来创建要返回的Month对象。
我认为这是不好的做法,许多编制者应该发出警告。如果这是为您编译的,请尝试更改编译器警告级别,使其更严格。
答案 3 :(得分:-1)
您的构造函数是私有的。如果您希望能够使用int构造Month
的实例,则必须将该构造函数声明为public