Saw the following code snippet and I have problems to understand how it works.
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;
}
The class is designed in this way so that the user will not get invalid month value.
Here is the question: why the 开发者_运维技巧static function Jan can return 1 with the return value as Month?
Thank you
Based on the comments, this class can be designed as follows:
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;
};
The Month
object is created automatically using the Month(int)
constructor. It could/should have been written this way to be explicit:
static const Month Jan() { return Month(1); }
Note that good practice is to declare constructors that take one parameter as explicit
. Indeed, these constructors can be used to perform type conversions, as you have experienced with your code. Good practice is to declare these constructors explicit, so that this automatic conversion do not occur. It would have forced you to write it as I did.
Because you didn't mark your constructor as "explicit", so it can be used in an implicit conversion operation.
I think the constructor is being used in an implicit cast.
Ie. The constructor can create a Month object from an integer. The compiler is automatically using this to create the Month object to return.
I would consider it bad practice, and many compilers should give a warning. If this is compiling for you, try changing your compiler warning level so it is stricter.
Your constructor is private. If you want to be able to construct instances of Month
with an int, you must declare that constructor as public
精彩评论