当前位置:  编程技术>c/c++/嵌入式

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

    来源: 互联网  发布时间:2014-10-11

    本文导语:  1.尽量用类的非成员函数以及友元函数替换类的成员函数 例如一个类来模拟人People 代码如下: 1 class People{ 2 public: 3 ... 4 void Getup( ); 5 void Washing( ); 6 void eating( ); 7 ... 8 } 其实上面三个动作是早上“起床”、“洗簌”、“吃饭”三...

1.尽量用类的非成员函数以及友元函数替换类的成员函数
例如一个类来模拟人People
代码如下:

1 class People{
2 public:
3 ...
4 void Getup( );
5 void Washing( );
6 void eating( );
7 ...
8 }

其实上面三个动作是早上“起床”、“洗簌”、“吃饭”三个常见的动作,如果现在用一个函数来表示使用成员函数即为
代码如下:

1 class People
2 {
3 ...
4 void morningAction( )
5 {
6 Getup( );
7 Washing( );
8 eating( );
9 }
10 }

如果写一个非成员函数即为
代码如下:

1 void moringAction(People& p)
2 {
3 p.Getup( );
4 p.Washing( );
5 p.eating( );
6 }

那么是选择类的成员函数还是类的非成员函数呢?

面向对象则要求是,将操作数据的函数与数据放在一起。但这不意味着要选择成员函数。从封装的角度看,成员函数的moringAction封装性比非成员函数要低。如果某些东西被封装,它就不再可见。越多东西被封装,越少人可以看到它。所以使用非成员函数的类,封装性较低。而越少人看到它,我们就有越大弹性去变化它,因为我们的改变仅仅直接影响看到改变的那些人事物。因此,越多东西被封装,改变哪些东西能力越大。

在考虑对象内的数据。越少的代码可以看到数据(访问它),越多的数据可以被封装,而我们也就越能自由改变对象数据。现在如果一个成员函数、非成员函数都能提供相同的机能,我们选择非成员函数。

在说下面内容之前我们先谈谈C++中的类型转换分显示类型转换和隐式类型转换。

2.显示类型转换

C++有显示类型转换操作符分别为:static_cast,const_cast,dynamic_cast和reinterpret_cast


2.1static_cast
转换功能与C风格类型转换一样,含义也一样。通过使用static_cast可以使没有继承关系的类型进行转换。但是要注意不能将内置类型转化为自定义类型,或者将自定义类型转化为内置类型,并且不能将cosnt类型去掉,但能将non-cosnt类型转换为const类型。例如:
char a='a';

int b=static_cast(a);
两个类型之间的转换,其实也是要自己实现支持,原理和内置类型之间转换相似。
代码如下:

1 #include
2 class Car;
3
4 class People
5 {
6 public:
7 People(int a,int h)
8 :age(a),height(h)
9 {}
10
11 inline int getAge() const
12 {
13 return age;
14 }
15
16 inline int getHeight() const
17 {
18 return height;
19 }
20
21 People & operator=(const Car& c);
22 private:
23 int age;
24 int height;
25 };
26
27 class Car
28 {
29 public:
30 Car(double c, double w)
31 :cost(c),weight(w)
32 {}
33
34 inline double getCost() const
35 {
36 return cost;
37 }
38
39 inline double getWeight() const
40 {
41 return weight;
42 }
43
44 Car & operator=(const People& c);
45 private:
46 double cost;
47 double weight;
48 };
49
50 People & People::operator=(const Car& c)
51 {
52 age = static_cast(c.getCost());
53 height = static_cast(c.getWeight());
54 return *this;
55 }
56
57 Car & Car::operator=(const People& c)
58 {
59 cost = static_cast(c.getAge());
60 weight = static_cast(c.getHeight());
61 return *this;
62 }
63
64 int main(int argc,char * argv[])
65 {
66 Car c(1000.87,287.65);
67 People p(20,66);
68 People p2(0,0);
69 Car c2(0.00,0.00);
70 p2=c;
71 c2=p;
72 std::cout

    
 
 

您可能感兴趣的文章:

  • C++ Maps 成员 key_comp():返回比较元素key的函数
  • gdb调试时如何进入类成员函数和模板类成员函数?谢谢
  • C++ Maps 成员 value_comp():返回比较元素value的函数
  • 关于C++静态成员函数访问非静态成员变量的问题
  • C++ MultiMaps 成员 key_comp():返回比较key的函数
  • linux下类的成员函数不可以作为自定义的信号处理函数么?
  • C++ MultiMaps 成员 value_comp():返回比较元素value的函数
  • 一个基本概念问题:静态函数只能调用静态方法,类的成员函数也是静态的吗?
  • C++ STL Bitsets构造函数及成员函数解释及代码示例
  • 指向类成员函数的指针其实并非指针
  • C++ Strings(字符串) 成员 Constructors:构造函数,用于字符串初始化
  • 请问在linux下面编程怎样查询stl类的成员函数
  • c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例
  • 如何在工作线程中调用图形界面线程的成员函数(串口通信)?
  • Windows和Linux下C++类成员方法作为线程函数方法介绍
  • 怎样在一个类里面互相调用成员函数?
  • C++ STL库中priority_queue介绍,成员函数说明及priority_queue具体用法举例
  • linux的动态链接库开发的时候,基类带有虚成员函数的话会找不到符号。
  • 双向队列Deque 类成员函数列表参考(c++ STL 容器)
  • 如何编译含有静态成员函数的C++文件?
  • c++ STL关联式容器Map成员函数介绍及查找(find()),插入(insert()),删除(erase())等操作代码举例
  • 线程 和 成员函数 的问题
  • C++ I/O 成员 sync_with_stdio():同标准I/O同步
  • C++类中的常数据成员与静态数据成员之间的区别
  • C++ MultiMaps 成员 begin():返回指向第一个元素的迭代器
  • C++空类及没有成员变量的类的大小实例分析
  • C++ Vectors 成员 rbegin():返回Vector尾部的逆迭代器
  • C++类的静态成员初始化详细讲解
  • C++ Bitsets 成员 count():返回被设置的位的个数
  • C++调试追踪class成员变量的方法
  • C++ Bitsets 成员 flip():反转bits中的位
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.lang.reflect类method的类成员方法: getdefaultvalue定义及介绍
  • 请问:什么是实例成员和类成员?
  • java命名空间java.security.acl接口group的类成员方法: ismember定义及介绍
  • 类A为什么从外包继承一个protected成员后,类A的子类为什么不能访问这个成员
  • java命名空间java.lang.reflect接口member的类成员方法: getname定义及介绍
  • 将父类变量强制赋予子类变量时,发生了什么?比如子类的成员变量,假如父类中有不存在子类中有的成员变量的情况,那么子类中该变量是否默认取值???
  • java命名空间java.security.acl接口group的类成员方法: addmember定义及介绍
  • getgrnam获得group结构后,如何遍历gr_mem成员或者组成员?
  • java命名空间java.lang.reflect接口member的类成员方法: declared定义及介绍
  • 类静态变量能定义在成员方法中吗?? 在线
  • java命名空间java.lang.reflect接口member的类成员方法: public定义及介绍
  • Python 面向对象 成员的访问约束
  • java命名空间java.security.acl接口group的类成员方法: members定义及介绍
  • 成员管理系统 ClubMaster
  • java命名空间java.lang.reflect接口member的类成员方法: getmodifiers定义及介绍
  • 深入C#实例成员和静态成员详解
  • java命名空间javax.sound.sampled类compoundcontrol的类成员方法: compoundcontrol定义及介绍
  • 如何把Object的各类型的数据成员填充到byte缓冲区
  • java命名空间java.lang类class<t>的类成员方法: ismemberclass定义及介绍
  • jsp Recordset 对象有 PageSize 成员吗
  • java命名空间java.security.acl接口group的类成员方法: removemember定义及介绍
  • public成员为什么找不到?头大啊……




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3