类接口的一般性原则:
1.保持接口的完整性
2.保持接口的最小化
3.提供构造函数
4.支持(或禁止)拷贝
5.使用类型来提供完善的类型检查
6.支持不可修改的成员函数
7.在析构函数中释放资源
原则参见相册
5.使用类型来提供完善的类型检查
举例:Date d1(4,5,2005);
Date d2(2005,4,5);
第一个问题:2005无效的日期,我们可以通过构造函数初始化之后进行检测
第二个问题:4月5日 还是5月4日,参数有效性是检查不出来的,这时候我们可以通过一种明显的解决方案使用类型系统
class Date{
public:
enum Month{
Jan = 1,Feb,...Dec
};
Date(int y,Month m,int d);
//......
private:
int y;
Month m;
int d;
}
如果出现月份日期颠倒,编译器会报错
Date(2005,4,5);//error
Date(2005,Date::Jan,6);//ok 我们在类名后面用::,在对象后面用.(点)
4.COPY
Date holiday(2005,Date::jun,7);//ok
Date d2 = holiday;//ok
Date d3 = Date(2007,Date::dec,8);//ok
holiday = Date(2016,Date::jan,13);//ok
d3 = holiday;//ok
5.默认构造函数
类中的构造函数非常重要,来为对象进行初始化操作,如果我们没进行初始化操作,我们的对象就会访问随机地址,系统会报错,所以我们也可以在构造函数中,进行默认的初始化,叫默认构造函数,给一个相对合理的值
c++中内置的类型比如int double string 都有默认的构造函数,所以一下代码成立:
例如:string s1;//default value string = "";
vector<string>s1;//okdefault the vector on element,the empty vector
vector<string>v2(10);//ok vector of 10 default string
它们都有隐含的默认的构造函数
对于类型T,T()就是它的默认值,这个是默认构造函数实现的因此 下面代码跟上面代码等价:
例如:string s1=string s1();//default value string = "";
vector<string>s1=vector<string>s1();//okdefault the vector on element,the empty vector
vector<string>v2(10)=vector<string>v2(10,string());//ok vector of 10 default string
同理 int()=0;
double() = 0.0//系统内置类型初始化默认值为0.0
我们接下来为Date类设计一个默认构造函数,我们可以定义2001年1月1日为默认值,当然这未必是做适合的值,可以根据项目的具体情况选择合适的默认值
默认的构造函数就不需要传递参数了,如下
Date::Date(){
:y(2001),m(Date::jan),d(1)
};
如果不想把默认值写入构造函数中,我们也可以单独写一个默认值函数
Date&default_date(){
//引用是什么意思???static Date dd(2001,Date::jan,1);//static这里使用的全局变量,这样在调用函数的时候就不会每次都创建对象dd
return dd;//返回值不应该是&dd吗??
};
Date::Date(){
:y(defalut.year()),m(defalut.month()),d(defalut.day)
};
有了默认构造函数我们可以定义数据:
例如:vector<Date>birthdays(10);
如果没有默认构造函数,我们不得不这么做:
vector<Date>birthdays(10,default_date());
6.Const成员函数
class Date(){
public:
int day()const;//const member:can't modify the object
Month month()const;
int year()const;
void add_day(int n);//non-const member:can modify the object
//.......h
private:
int d;
Month m;
int y;
};
Date d(2005,Date::mar,24);
const Date cd(2005,Date::mar,24);
count<<d.day()<<","<<cd.day()<<endl;//ok
d.add_day(1);//ok
cd.add_day(2);//error
int Date::day()const{
++d;
return d;//error,day()const can't modify
}