在设计一个Date类的时候,我们使用int类型来表示年份,如果我们需要对年份进行一些特殊的操作(如:检查,保护等),就很需要定义一个Year类,如下:
class Year {
int m_y;
public:
//explicit限制int到Year的隐式转换
explicit Year(int y)
: y(m_y) { }
//Year到int的类型转换
operator int() const
{ return m_y; }
//other funtion
}
class Date {
public :
Date(int d, Month m, Year y);
//
};
Date d1(1987, feb, 21); //error, 21不能隐式转换为Year
Date d2(21, feb, Year(1987)); //ok
在这里Year就只是包裹住了int,对int提供一层保护而已。由于operator int()的存在,只要需要,Year可以隐式的转化为int出现运算表达式中参加运算。而通过给构造函数声明为explicit,就能够保证,int到Year的转化只能在明确无误的情况进行,避免了意外的赋值。
显示构造函数和转换运算符的合作,让Year可以当int使用,同时又对Year进行一定的保护。。。