您的位置:首页 > 编程语言 > C语言/C++

接口的设计(让类被正确的使用)——《Effective c++》

2017-04-20 11:04 225 查看
要开发一个不容易被误用的类,我们就要首先考虑用你的类的用户可能会犯怎样的错误

//首先介绍一下explicit
//考虑如下代码:
class String {
String ( int n ); //本意是预先分配n个字节给字符串
String ( const char* p ); // 用C风格的字符串p作为初始化值
...
}

String s2 ( 10 );   //OK 分配10个字节的空字符串
String s3 = String ( 10 ); //OK 分配10个字节的空字符串

String s4 = 10; //编译通过,也是分配10个字节的空字符串
String s5 = ‘a’; //编译通过,分配int(‘a’)个字节的空字符串

//s4 和s5 分别把一个int型和char型,隐式转换成了分配若干字节的空字符串,容易令人误解。
//为了避免这种错误的发生,我们可以声明显示的转换,使用explicit 关键字,这样,后面的两个操作将不会被编译通过


//explicit 预防出现隐式转换
struct Day{
explicit Day(int d) :val(d){};
int val;
};
struct Month{
explicit Month(int m) :val(m){};
int val;
};
struct Year{
explicit Year(int y) :val(y){};
int val;
};
class Date{

private:
Year _year;
Month _month;
Day _day;
public:
Date(const  Month& mon, const  Day& day, const  Year& year) :_year(year), _month(mon), _day(day){};

};
int  main(){

//  Date d(1,4,5);  //错误
//  Date d(Month(5),Year(2015),Day(25));  //错误
Date d(Month(5),Day(25),Year(2015));  //正确
//防止用户不小心误用
system("pause");
return 0;
}

//为了防止用户输入的Date符合标准,比如一年只有十二个月,我们也可以这样设计class Month(其他的如每月的天数同样可以如此)
class Month{
public:
static Month Jan(){ return Month(1); };
//...
explicit Month(int m) :val(m){};
private:
int val;
};
//然后用户调用接口时,就只能写这样的代码:
Date d(Month::Jan(), Day(25), Year(2015));  //正确
//规范用户的行为,为用户考虑到所有可能犯错的方面
//当然,以上的例子太过于理想化了,但是这个思想是可以借鉴的。就这样
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐