如何设计好类的接口
2016-01-12 21:31
211 查看
[b]类接口的一般性原则:[/b]
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
}
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
}
相关文章推荐
- svn -- 数据备份,版本回退,版本冲突,多仓库配置
- 哈夫曼树---贪婪法
- lintcode:previous permutation上一个排列
- c++架构
- Swift开发IOS-UIScrollView
- solr学习2
- XML属性移动删除
- Native Service的实现
- 总结2015之Spark篇:新生态系统的形成
- spring boot 将dependency 从fat jar 中抽取出来
- Linux下设置环境变量
- Android之Intent的初步认识
- 第五章 简单的数据查询
- CF-edu#5 E - Sum of Remainders -数学-枚举
- 公钥,私钥,数字签名的理解
- Android应用解决65K方法数
- python中对文件、文件夹(文件操作函数)的操作
- 利用自定义的 RecyclerView 实现相册的滑动功能
- python selenium的模拟点击,模拟滑动等操作
- 综合一句话Shell破解