C++学了这么多年,你仍不知道的事!!!
C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类的实现放在cpp文件中。它们为什么能够关联到一起呢?你知道什么东西可以放在.h文件中,什么不能。什么东西又可以放在cpp文件中。如果你忘记了或是压根就不明白,那么读过此文你会清晰无比!! 首先谈下声明与定义的区别。
声明是将一个名称引入程序。定义提供了一个实体在程序中的唯一描述。声明和定义有时是同时存在的。
如int a;
extern int b=1;
只有当extern中不存在初始化式是才是声明。其他情况既是定义也是声明。
但是在下列情况下,声明仅仅是声明:
1:仅仅提供函数原型。如void func(int,int);
2: extern int a;
3:class A;
4:typedef声明
5:在类中定义的静态数据成员的声明
如:
typedef int IntA;typedef int InB;
在需要IntA的地方使用IntB是不会报错的。它们可以互相替换。因为此我们称它不提供类型安全。但是在定义函数类型时typedef经常使用,可以使定义更清晰。
标准c库提供一个assert宏,用以保证给定的表达式值非零。否则便会输出错误信息并终止程序执行。只有在程序中没有定义NDEBUG时,assert才会工作。一旦定义NDEBUG ,assert语句将会被忽略 。注意与VC中的ASSERT相区别。ASSERT是vc提供的。当_DEBUG被定义时才会起作用。
在vc的DEBUG模式下_DEBUG会被定义。而在RELEASE模式下NDEBUG会被定义。
好了,相信大家都会明白开头提出的问题了。如果有不明白的,请务必留言哦。如有错误,也请不吝指正!!
以上内容参考自《Large Scale C++ software design》。
- 28楼DogFeet44分钟前
- 我个人感觉:n1..h文件和.cpp .c文件没有任何关联,虽然有时候我们把他们的名字取的一样,感觉很神奇就能包含到一起。n其实编译器从来只编译源文件。源文件里面的#include就相当于整段该头文件的内容。n所以,所谓的声明,定义,其实本来和在.h还是.cpp中时没有关系的。重要的是,这个.cpp文件在编译的时候,组合的.cpp文件中的语法会不会产生冲突。n2.如果你愿意,你可以随便更改头文件的后缀名n3.你甚至可以将头文件当做一个宏使用。n 比如,a.h中内容是: 1,2,3,n 你甚至可以在a.c中这样写 n int a[3] = {n #include "a.h"}; (当然,不是建议这么写,只是更容易看清所谓头文件的本质。)
- 27楼ithzhang昨天 23:34
- 我先顶一个吧!!!
- 26楼kun_jing8216昨天 18:21
- 还行,学习
- 25楼baifuhan昨天 16:57
- 有些用途!谢谢分享!
- 24楼q408384053昨天 15:37
- 顶一个,昨天还在为头文件里面的声明头疼,学习了。
- 23楼xindaniu昨天 14:27
- 参看 Effective C++
- 22楼go_and_see昨天 13:48
- LZ说的这些东西,大多数CPP程序员都会注意到的。如果写了1、2年CPP代码,这些东西还没搞懂,那只能说他没用心。
- 21楼Funniest昨天 09:40
- 晕,题目太大了。
- Re: ithzhang昨天 12:46
- 回复Funniestn哈哈。是大了。
- 20楼leesan0802昨天 01:20
- 看的有点头晕晕的
- 19楼mmkk22昨天 23:13
- 这样啊
- 18楼wangqiulin123456昨天 20:41
- 虽说不是很懂,但是看到这个题目 想到的肯定不是这些内容
- 17楼weiningbo2010昨天 20:39
- 就那样吧。。。
- 16楼a283489754昨天 18:11
- 上首页了,好像挺简单的,我以为会从编译原理的角度讲。
- 15楼qsdxt_123昨天 17:55
- 海康、大华,去年这两家曾是我想进入的公司...
- 14楼power_devil昨天 17:54
- 没说清楚
- 13楼shendl昨天 14:47
- 标题党
- 12楼lming_08昨天 14:05
- 不是因为include吗?
- 11楼xinyu200昨天 11:34
- 顶一下!!
- 10楼q277055799前天 05:30
- 感觉知道了这些,也没啥用
- Re: ithzhang昨天 11:02
- 回复q277055799n此言差矣!!!
- 9楼maner_1022前天 00:22
- 受教了,之前都没有想过。
- 8楼hewei836前天 22:37
- 顶了再说
- 7楼gtyi999前天 22:19
- 看了一遍,感觉没说到主题上。
- 6楼ylyzdp12前天 22:05
- 此人理论知识相对丰富
- 5楼taskctl2012前天 21:35
- 说的还可以嘛
- 4楼anonymous9114天前 19:19
- 不错。学习了。
- 3楼majianwei07055天前 07:11
- 跟一个
- 2楼oxcow5天前 19:48
- “ 如int a; extern int b=1; 只有当extern中不存在初始化式是才是声明。其他情况既是定义也是声明 ” nn--------------C++ Primer 中讲到 -------------------------nint b = 1; //赋值nint b(1); // 初始化
- 1楼immigrator5天前 19:47
- 怎么看下来反而有点糊涂了