为什么类的定义要放在头文件中,但是实际的函数代码不能放在头文件中呢?

lzxlzx777 2009-09-10 01:43:39
为什么类的定义要放在头文件中,但是实际的函数代码不能放在头文件中呢?
--------------------------
比如一个类

class mycls()
{
pubilc:
int a,b;
int prog1()
{
cout <<a << endl;
return 0;
}

}

按规范不能全部放在头文件中,要分开放,将函数代码放在头文件外:
即:
头文件中:
class mycls ()
{
pubilc:
int a,b;
int prog1();
}

cpp源文件中:

mycls:: int prog1()
{
cout <<a << endl;
return 0;
}

----------------------------------
为什么分开呢?本来是一个整体,分开后,查询代码也麻烦,写着也麻烦呀,道理何在呢?



...全文
670 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zk_sima 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 liuharris 的回复:]
请楼主耐心读完下面的文章,你就可以清楚啦,先说明,我是找来的,不要说我乱copy,对你有帮助就可以,不一定要我自己写的


首先,我们可以将所有东西都放在一个.cpp文件内.然后编译器就将这个.cpp编译成.obj,obj是什么东西?就是编译单元了.一个程序,可以由一个编译单元组成,也可以有多个编译单元组成. 如果你不想让你的源代码变得很难阅读的话,就请使用多个编译单元吧.(一个函数不能放到……
[/Quote]
up 学习了
liuharris 2009-09-10
  • 打赏
  • 举报
回复
请楼主耐心读完下面的文章,你就可以清楚啦,先说明,我是找来的,不要说我乱copy,对你有帮助就可以,不一定要我自己写的


首先,我们可以将所有东西都放在一个.cpp文件内.然后编译器就将这个.cpp编译成.obj,obj是什么东西?就是编译单元了.一个程序,可以由一个编译单元组成,也可以有多个编译单元组成. 如果你不想让你的源代码变得很难阅读的话,就请使用多个编译单元吧.(一个函数不能放到两个编译单元里面,但两个以上就可以分别放在一个单元,也就是cpp里面)那么就是一个.cpp对应一个.obj,然后将所有的obj链接起来(通过一个叫链接器的程序),组成一个.exe,也就是程序了.如果一个.cpp要用到另一个.cpp定义的函数怎么办? 只需在这个.cpp种写上他的函数声明就可以了.其余工作由链接器帮你完成,你可以随便调用该函数.链接器将所有的obj连接起来,但是如果碰巧有相同的函数或外部变量怎么办?他如何识别?一般来说是不能允许在同一个程序中,出现两个一样的函数名或外部变量名.但是只得庆幸的是,c++可以通过一种叫做链接属性的关键字来限定,你这个函数是属于整个程序公用的,还是只是在一个编译单元obj里面使用的.这些关键字就是extern 和 static; extern是外部链接的意思,也就是除了这个单元,外部的单元也是能够访问这个函数的.static 是内部链接,自属于自己单元.说了这么久,还没有说.h的作用呢?其实没有.h也能很好的工作,但是当你发现一个外部链接的函数或外部变量,需要许多份声明,因为c++这种语言,在使用函数和变量的时候,必须将他声明,为何要声明?声明之后才知道他的规格,才能更好的发现不和规格的部分.你别妄想一个编译单元,会自动从另一个编译单元那里得到什么信息,知道你是如何定义这个函数的.所以说,只要使用到该函数的单元,就必须写一份声明在那个.cpp里面,这样是不是很麻烦,而且,如果要修改,就必须一个一个修改.这真让人受不了..h就是为了解决这个问题而诞生,他包含了这些公共的东西.然后所有需要使用该函数的.cpp,只需要用#include包含进去便可.以后需要修改,也只是修改一份内容.请注意不要滥用.h,.h里面不要写代码,.h不是.cpp的仓库,什么都塞到里面.如果在里面写代码,当其他.cpp包含他的时候,就会出现重复定义的情况,比如将函数func(){printf};放到头文件a.h,里面还有一些a.cpp需要的声明等;然后你发现b.cpp需要用到a.cpp里面的一个函数,就很高兴的将a.h包含进来.注意,#include并不是什么申请指令,他就是将指定的文件的内容,原封不动的拷贝进来.这时候实际上a.cpp和b.cpp都有一个func()函数的定义.如果这个函数是内部链接static的话,还好,浪费了一倍空间;如果是extern,外部链接(这个是默认情况),那么根据在同一个程序内不可出现同名函数的要求,连接器会毫不留情给你一个连接错误!;如果你还不太理解.那么就尝试不用h,只用多个cpp看看应该如何写.尝试在两个cpp中写同名函数.看看是否链接出错.尝试在cpp使用其他cpp定义的函数.看看应该如何做.
头文件是没有编译意义的,一般只是编译.cpp生成.obj.但是.cpp里面有#include将指定头文件(其实任何文件都行)插进来,组成完整的.cpp.如果你不喜欢这个方式,你也可以直接在.cpp里面写好了,而不放到.h里面,载用指令拷贝进来.头文件是工具,但不是必须.


LLanguage 2009-09-10
  • 打赏
  • 举报
回复
原因很多了,比如:写一个动态库,当然是不希望别人知道动态库中函数功能的具体实现,需要隐藏代码,这样只把调用的接口写在头文件里面,提供给别人调用,是不是就起到了代码隐藏和代码复用的作用呢?

另外有很多开源的c++库代码都是.hpp文件,这种文件里就同时包括了定义和实现。
会思考的草 2009-09-10
  • 打赏
  • 举报
回复
从编译的角度来说,头文件实际上是不会被编译的,被编译的是cpp/c文件,如果代码全部放在头文件中,则无法编译;如果多个cpp文件include了同一个头文件,每个obj文件中都有某个函数的一份实体,链接会出错。
hunterljm 2009-09-10
  • 打赏
  • 举报
回复
不是不能放,而是一种规范.只有少量代码的时候你放在头文件里没什么影响,但是当一个函数有成百上千行的时候你还放在头文件里,这样就会很杂乱的.这是一种规范,函数的声明都放在头文件中,函数的定义都放在源文件中.查询代码一点也不麻烦,你在头文件要查询的相关函数上点右键选择定义,就到了源文件中这个函数的实现文件里了.
lzxlzx777 2009-09-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zoulie 的回复:]
代码量不大当然看不出来
[/Quote]
还是不理解,代码多,放在.h中不行吗/

另外,这种规定是一种建议呀,还是一种要求,不这样做就不行呢?
sayhorse 2009-09-10
  • 打赏
  • 举报
回复
头文件提供接口
源文件提供实现
cctrys 2009-09-10
  • 打赏
  • 举报
回复
一般只有内联函数的实现部分才放在头文件中的,其他的最好放在cpp文件中!


VC驿站 - http://www.cctry.com
C、C++、VC++ 编程 学习 免费教程 精品电子书 精品源码 期待您的加入!
用户 昵称 2009-09-10
  • 打赏
  • 举报
回复
很简单,头文件可以给别人,代码则不同。
zoulie 2009-09-10
  • 打赏
  • 举报
回复
代码量不大当然看不出来

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧