成员函数与非成员函数的抉择

发表于:2012-12-29 09:43

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:胡佳    来源:51Testing软件测试网采编

  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);

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号