2010-10-26 38 views
4

看到下面的代码片段,我有问题要理解它是如何工作的。C++ - 为什么我可以返回一个int类的月

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; 
}; 

回答

12

使用Month(int)构造函数自动创建Month对象。它可以/应该已被写入这种方式是明确的:

static const Month Jan() { return Month(1); } 

注意,好的做法是,宣布采取一个参数explicit构造。事实上,这些构造函数可以用来执行类型转换,就像您使用代码一样。好的做法是明确声明这些构造函数,以免发生这种自动转换。它会迫使你像我一样写。

+0

你好Didier,所以你的观点是,如果我没有一个构造函数Month(int number),那么我将有问题让编译器执行implict转换。那是对的吗? - 谢谢 – q0987 2010-10-26 21:05:56

+2

'Month(int number)'构造函数也可以被设置为'explicit'。一般来说,最好用一个变量标记所有ctors为“explicit”(除了copy ctor)。 – fbrereto 2010-10-26 21:06:54

+0

是的,这是正确的。如果没有这个构造函数,编译器将不知道如何将'int'转换为'Month'。 – 2010-10-26 21:07:07

-1

你的构造函数是私有。如果您希望能够使用int构造Month的实例,则必须将该构造函数声明为public

+0

这个类是以这种方式设计的,所以用户只能得到一个值范围从1到12的月份类。 - 谢谢 – q0987 2010-10-26 21:04:20

+0

-1,'Month'的12个实例是本地的。 – Blindy 2010-10-26 21:06:33

1

因为您没有将您的构造函数标记为“显式”,所以它可用于隐式转换操作。

0

我认为这个构造函数被用于隐式转换。

即,构造函数可以从一个整数中创建一个Month对象。编译器自动使用它来创建Month对象以返回。

我认为这是不好的做法,许多编译器应该给出警告。如果这是为您编译,请尝试更改您的编译器警告级别,以便它更严格。

相关问题