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