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
Monthobject is created automatically using theMonth(int)constructor. It could/should have been written this way to be explicit: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.