函数接口,class接口,模板template接口,每一种接口都是客户与你的代码互动的手段。
class Data
{
public:
Date(int month,int day,int year);
....
}
以上代码可能会有两种错误!
1,他们可能传递错误次序参数;
Date d(30, 3, 1995);
2,他们可能传递一个无效的月份或天数;
Date d(2, 30, 1995);
既然这样我们可以导入简单的外覆类型来区别天数,月份,和年份。
struct Day struct Month struct Year
{ { {
explicit Day(int d):val(d){} explicit Month(int m):val(d) {} explict Year(int y):val(y){}
int val; int val; int val;
}; }; };
class Date
{
public:
Date(const Month &m,const Day&d, const Year& y);
...
}
Date d(30 , 3, 1995); //错误!不正确的类型
Date d(Day(30),Month(3),Year(1995)); //错误!不正确的类型
Date d(Month(3), Day(30), Year(1995)); //ok,类型正确
令Day,Month和Year成为成熟且充分锻炼的类并封装其内数据更好!
class Month
{
public:
static Month Jan(){ return Month(1);}
static Month Feb(){ return Month(2);}
....
static Month Dec(){ return Month(12);}
...
private :
explict Month(int m);
...
};
Date d(Month::Mar(),Day(30),Year(1995));