类的数据和函数成员分别定义放在头文件和cpp中,为何引用时只包含头文件就行?

bjwqt 2009-09-17 08:23:24
类的数据和函数成员分别定义放在头文件和cpp中,为何引用时只包含头文件就行?
根据类的接口与类的实现分开的原则,一般将类的数据成员放在头文件中,将所有的函数定义都放在cpp文件中,
然后程序中要定义这个类的对象时,#include一下头文件就行了,但是我不明白,编译器如何去自动找到类的成员函数的定义呢?因为没有代码指定这个类的函数代码放在哪个cpp文件中呀?
...全文
251 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
周成风 2009-09-17
  • 打赏
  • 举报
回复
编译的时候有头文件就可以了,只需要知道函数的定义。一个CPP文件编译生成.obj文件,然后链接器会把所有的.obj整合,外加资源文件最后生成exe文件。
killbug2004 2009-09-17
  • 打赏
  • 举报
回复
就像函数一样有前置声明一样,有头文件声明那么在编译的时候,就会在符号表中查找得到,编译期间各个模块是分开编译的,各个模块的符号,引用的类型等等元素能在符号表中找到,就说明是有效的,就可以编译通过,到了链接才会将各个模块链接到一起,这个时候才会处理代码间调用关联等关系,如果某个类你写了头文件,没有实现或者没有包含导出类的lib,就会在链接的时候出现错误,比如找不到某个函数的实现等等

学过编译原理会比较清楚 我没学过,只是个人的理解,描述不准确
brookmill 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bjwqt 的回复:]
一个cpp就对应一个obj,编译器要寻找所有的obj吗?
[/Quote]
对。
即使在某个obj里找到了,也要再看看其它的obj里还有没有,防止重复定义。
具体范围在windows里一般是用建立工程来控制的。linux用Makefile
bjwqt 2009-09-17
  • 打赏
  • 举报
回复
一个cpp就对应一个obj,编译器要寻找所有的obj吗?
brookmill 2009-09-17
  • 打赏
  • 举报
回复
准确地说,是到所有目标文件里去找成员函数的实现。目标文件是从cpp文件编译得到的。
brookmill 2009-09-17
  • 打赏
  • 举报
回复
编译器会到工程里的所有cpp文件里去找定义。
bjwqt 2009-09-17
  • 打赏
  • 举报
回复
up

65,206

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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