读书人

C++学了这么多年您仍不知道的事!

发布时间: 2012-11-13 10:00:51 作者: rapoo

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
怎么看下来反而有点糊涂了

读书人网 >C++

热点推荐