把类定义与类实现分开有什么实际意义?
2014-01-03 15:52
337 查看
1、保密——可以很容易看到类的接口,知道其使用方法,可以编译库后,只提供lib和头文件。
2、加快编译速度——如果你把类的所有代码都内联定义到头文件中,那么所有需要用到这个类的CPP文件实际上都包含了更多的代码,编译器编译每个这样的CPP文件时都编译了这些代码。而分开定义,这些代码就只被编译了一遍,也就是在编译实现那个类的CPP文件时。
还有就是当多个程序引用到类定义这个文件时,如果对实现有任何的修改也只需将实现那个文件重新编译下就OK了,就不需要每个程序都重新编译。
COM中遵循的就是接口与实现分离的哲学,实现可以随着时间变化,但是提供给客户利用的接口不发生变化,这样客户端的程序就不需要重新编译生成,因为所有的实现都在另外一个模块中,模块与模块之间只通过接口进行通讯。很容易做成与平台无关和编译器无关的程序。
4、可读性——如果你把所有的东西都放在头文件,最大的问题不在于编译器,而在于读你程序的人。一个复杂的类可能有几万行,即使只有几百行的源码,如果你所有一切都放在头文件内部,估计绝大多数人都没有耐心去了解你这个类提供了什么接口。只把声明放头文件可以让读你程序的人在几分钟内就知道你有几个函数和属性。
5、模块化——如果你放在头文件内部实现函数,你就不可能把这个类放到lib或者dll中去。
2、加快编译速度——如果你把类的所有代码都内联定义到头文件中,那么所有需要用到这个类的CPP文件实际上都包含了更多的代码,编译器编译每个这样的CPP文件时都编译了这些代码。而分开定义,这些代码就只被编译了一遍,也就是在编译实现那个类的CPP文件时。
还有就是当多个程序引用到类定义这个文件时,如果对实现有任何的修改也只需将实现那个文件重新编译下就OK了,就不需要每个程序都重新编译。
COM中遵循的就是接口与实现分离的哲学,实现可以随着时间变化,但是提供给客户利用的接口不发生变化,这样客户端的程序就不需要重新编译生成,因为所有的实现都在另外一个模块中,模块与模块之间只通过接口进行通讯。很容易做成与平台无关和编译器无关的程序。
4、可读性——如果你把所有的东西都放在头文件,最大的问题不在于编译器,而在于读你程序的人。一个复杂的类可能有几万行,即使只有几百行的源码,如果你所有一切都放在头文件内部,估计绝大多数人都没有耐心去了解你这个类提供了什么接口。只把声明放头文件可以让读你程序的人在几分钟内就知道你有几个函数和属性。
5、模块化——如果你放在头文件内部实现函数,你就不可能把这个类放到lib或者dll中去。
相关文章推荐
- java类实现serializable有什么好处或意义
- 接口的显式实现有什么意义?
- nativa java里面定义了函数,在JNI里面也实现了,函数名参数什么的都没有错,调用native函数是怎么就出现链接失败的情况呢???
- 如果类a继承类b,实现接口c,而类b和接口c中定义了同名变量,请问会出现什么问题?(瞬联)
- 如果类a继承类b,实现接口c,而类b和接口c中定义了同名变量,请问会出现什么问题?(瞬联)
- <time>标签里面的时间有什么实际意义?
- 把程序的定义与实现部分用头文件与源文件分开
- 模板类的定义和实现不能分开,只能写在.h中,否则链接的时候会报错
- 什么是回调函数,如何定义和实现一个类的成员函数为回调函数(转)
- 第七周上机任务三--实现一个复数类--通过模板类的技术手段,设计Complex,使实部和虚部的类型为定义对象时用的实际类型
- Java 抽象类实现的意义:方法与方法体分开写!
- 摄像机标定算法中的很多处理,都有道理。比如内参数矩阵的定义。实现了单位的归一化,使世界坐标的实际值不重要,单位也不重要,只是单位为1的方格。
- 什么是形式参数,什么是实际参数,它们的区别和各自的定义是什么
- c/c++模板的定义和实现分开的问题(一)
- java中方法重载是什么, 实际中到底有什么意义, 用处?请举例
- C++:对象数组、对象动态申请和释放、类的定义和实现分开、this指针、常成员函数、时钟
- 什么是回调函数,如何定义和实现一个类的成员函数为回调函数(转)
- 把程序的定义与实现部分用头文件与源文件分开
- 把程序的定义与实现部分用头文件与源文件分开
- 17周练习一(1.1)该定义函数不能实现实际参数在必要时的交换