C++ C++;——为什么我可以为班级月份返回整数
看到下面的代码片段,我很难理解它是如何工作的C++ C++;——为什么我可以为班级月份返回整数,c++,C++,看到下面的代码片段,我很难理解它是如何工作的 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) {} con
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;
};
您的构造函数是私有的。如果希望能够使用int构造
Month
的实例,则必须将该构造函数声明为public使用Month(int)
构造函数自动创建Month
对象。它可以/应该这样写以明确:
static const Month Jan() { return Month(1); }
请注意,好的做法是声明将一个参数作为
显式的构造函数。实际上,这些构造函数可以用于执行类型转换,正如您在代码中所经历的那样。良好的实践是显式声明这些构造函数,这样就不会发生这种自动转换。它会迫使您像我一样编写它。因为您没有将构造函数标记为“显式”,所以它可以用于隐式转换操作。我认为构造函数正在隐式转换中使用
构造函数可以从一个整数创建一个月对象。编译器会自动使用它来创建要返回的Month对象
我认为这是不好的做法,许多编译器应该发出警告。如果这是为您编译的,请尝试更改编译器警告级别,使其更为严格。此类的设计方式是,用户只能获得值范围为1到12的month类。-谢谢你Hello Didier,你的观点是,如果我没有构造函数Month(int number),那么我将无法让编译器进行隐式转换。对吗?--谢谢月份(整数)
构造函数也可以设置为显式
。一般来说,使用单个变量将所有系数标记为explicit
(复制系数除外)是一种良好做法。是的,这是正确的。如果没有这个构造函数,编译器将不知道如何将int
转换为Month
。