您的位置:首页 > 其它

如何设计好类的接口

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: