1、尽量用类的非成员函数以及友元函数替换类的成员函数
例如一个类来模拟人People
class People{ public: ... void Getup( ); void Washing( ); void eating( ); ... } |
其实上面三个动作是早上“起床”、“洗簌”、“吃饭”三个常见的动作,如果现在用一个函数来表示使用成员函数即为
class People { ... void morningAction( ) { Getup( ); Washing( ); eating( ); } } |
如果写一个非成员函数即为
void moringAction(People& p) { p.Getup( ); p.Washing( ); p.eating( ); } |
那么是选择类的成员函数还是类的非成员函数呢?
面向对象则要求是,将操作数据的函数与数据放在一起。但这不意味着要选择成员函数。从封装的角度看,成员函数的moringAction封装性比非成员函数要低。如果某些东西被封装,它就不再可见。越多东西被封装,越少人可以看到它。所以使用非成员函数的类,封装性较低。而越少人看到它,我们就有越大弹性去变化它,因为我们的改变仅仅直接影响看到改变的那些人事物。因此,越多东西被封装,改变哪些东西能力越大。
在考虑对象内的数据。越少的代码可以看到数据(访问它),越多的数据可以被封装,而我们也就越能自由改变对象数据。现在如果一个成员函数、非成员函数都能提供相同的机能,我们选择非成员函数。
在说下面内容之前我们先谈谈C++中的类型转换分显示类型转换和隐式类型转换。
2、显示类型转换
C++有显示类型转换操作符分别为:static_cast,const_cast,dynamic_cast和reinterpret_cast
2.1 static_cast
转换功能与C风格类型转换一样,含义也一样。通过使用static_cast可以使没有继承关系的类型进行转换。但是要注意不能将内置类型转化为自定义类型,或者将自定义类型转化为内置类型,并且不能将cosnt类型去掉,但能将non-cosnt类型转换为const类型。例如:
char a='a'; int b=static_cast<int>(a); |