C ++ - 为什么我可以返回类Month的int

时间:2010-10-26 21:00:12

标签: 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) {}
    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;
};

4 个答案:

答案 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