当前位置: 编程技术>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())等操作代码举例
例如一个类来模拟人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