原链接:http://blog.csdn.net/yipiantiandi/article/details/5822564

在使用C++进行程序开发的时候,有个常识我们很熟悉,就是把类的定义写在.h文件中,把类的具体实现写在.cpp文件中。这毫无疑问是对的。但我们很少去思考为什么要这样做,本文结合自己的学习体会,对头文件及const对象的定义进行一些说明。

1。为什么要使用头文件

使用头文件就是为了在希望使用一些共同函数或数据的时候,只需包含这个文件就能实现,无需多次重复编写相同的代码,提高了效率。

2。什么东西可以写在头文件中

在头文件中,我们的编程经验是,函数的声明,类的定义等等应该写在头文件里面。但具体哪些可以写,哪些不可以,并不十分清楚。

在C++程序中,我们可以知道对于变量或函数的定义是唯一的,如果在同一个作用域内有重复的定义,就会产生编译错误。而头文件是要被多个文件包含的,如果在头文件中存放变量或函数的定义,则会导致编译提示重定义这样的错误,而声明则是可以多处编写的,所以,通过程序的基本知识,头文件中应该写声明,而不能写定义。

3。例外的情况

但我们确实在实践中有定义放在头文件中,而且并不引发编译错误,难道定义可以放在头文件中吗,C++允许部分重定义吗?

C++中允许在头文件中定义的有三中情况:

(1)类定义

(2)内联函数定义(inline函数。在头文件中有函数实现的,默认为内联函数)

(3)const 对象定义

其实以上三种情况的原因可以理解为是相同的。以const对象作为例子,说明如下:

对于一般的对象 如 int a=9;;

我们知道它的作用域是整个程序的,在1.cpp和2.cpp中包含同一个定义了int a=9;的头文件,因为int a=9;作用域是整个程序,所以会产生错误。那为什么const int a=9;不会产生错误呢。原因就是const int a=9;的默认作用范围是文件作用域的。即,尽管在1.cpp和2.cpp中包含同一个定义了const int a=9;的头文件,但由于const int a=9;是文件作用域的,包含了头文件的1.cpp和2.cpp尽管都包含了const int a=9;但他们是各自文件内的const对象,两者互不相干,就像不同函数中定义了相同的变量名一样。

所以,通过在头文件中定义const对象,可以实现多个文件使用相同的常量值,这在实际的程序中很常见。

说到这里,有一点疑问需要解决:如果想在别的文件中访问本文件中的const对象该怎么办,如果都是单是在别的文件中使用extern const int a = 9;的话,不会起任何作用,因为已经提示const int a = 9;是文件作用域的。所以应该在需要被其他文件使用的const对象定义成这样:extern const int a = 9;而在别的需要使用这个const对象的地方使用:extern const int a;前者是定义,后者是声明。这样就可以使用了。

通过对const对象的说明,我们知道由于是文件作用域的原因,可以把const对象的定义写在头文件中。对于另外两种情况,从实践上来看,我觉得也可以认为他们具有文件作用域。

比如在同一个文件中,编写两个完全相同的类的定义,编译会提示重定义错误,但在两个不同的文件中,编写完全相同的类的定义,不会导致编译错误,这说明类的作用域也是文件作用域,在包含了同一个头文件的不同文件中,虽然都包含了同一个类的定义,但程序理解为是两个不同的类的定义(尽管结构完全相同),但这在实现上没有问题。当然,关于inline函数也可以这样理解,具体原因可能需要查看编译器的相关资料

C++头文件的若干说明和const对象定义相关推荐

  1. 习题 8.4 在本章第8.3.3节中分别给出了包含类定义的头文件student.h,包含成员函数定义的源文件student.cpp以及包含主函数的源文件main.cpp。请完善该程序,在类中增加。。。

    C++程序设计(第三版) 谭浩强 习题8.4 个人设计 习题 8.4 在本章第8.3.3节中分别给出了包含类定义的头文件student.h,包含成员函数定义的源文件student.cpp以及包含主函数 ...

  2. 为什么c++要“在头文件中声明,在源文件中定义”?

    >>> 搬运一个知乎问答 ===================下面是回答=================== 答1. 然后问题来了:假如你这个函数到处都要用到,你总不能每个cpp ...

  3. c语言中引用头使用什么指令,在源文件(.c)和头文件(.h)中声明和定义的区别——C语言...

    最近在看多文件编程的时候遇到的一个问题,本来以为理解了声明和定义的区别(然而并没有····),也算是重新认识了一次声明和定义,下面上代码 声明和定义:有分配空间的叫定义,没分配空间的叫声明 定义:表示 ...

  4. c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件

    Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...

  5. C/C++头文件与变量的声明和定义

    版权声明:本文为博主转载文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 原文链接:https://blog.csdn.net/mountzf/article/deta ...

  6. 关于在头文件中定义变量

    注意头文件中不可以放变量的定义!!!一般情况下头文件中只放变量的声明,因为头文件要被其他文件包含(即#include),如果把定义放到头文件的话,就不能避免多次定义变量,C++不允许多次定义变量,一个 ...

  7. 【C++】C++中的头文件(.h)—详解(2)

    接上... [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 头文件中写些什么 在上篇博客中写到头文件本身不参与编译,但是它们被包含到源文件中 ...

  8. 第二篇:浅谈自定义头文件可能导致的重定义问题

    前言 总看到一些地方说定义语句别放在头文件中,因为会引起重定义.但具体编程中,却发现有些定义又不得不放在头文件中. 这可如何是好?基于对这个问题的思考,有了这篇随笔. 重定义产生的情况 情况一:多个源 ...

  9. C++中编写自己的头文件

    自己写的头文件需要用""引用 标准的头文件要用<>引用 头文件只能写声明,不能写定义!!!,但是可以写const的定义. 头文件主要包括:(和源文件相对应) 1.类的声 ...

  10. [转]C++中的头文件和源文件 .h .cpp

    头文件放声明,源文件放具体定义. 原文: http://www.cnblogs.com/lidabo/archive/2012/04/17/2454568.html 一.C++编译模式 通常,在一个C ...

最新文章

  1. Flask-Email中的mail.record_messages()使用方法和实现
  2. python - paramiko模块 修改logging提示为静默
  3. UA OPTI512R 傅立叶光学导论24 相干传递函数
  4. UI5 Source code map机制的细节介绍
  5. 很多人不知道的中国高校“V9联盟”,另一领域的顶尖牛校!
  6. [区块链] 拜占庭将军问题 [BFT]
  7. 加密算法使用(五):RSA使用全过程
  8. wincc服务器客户端用虚拟机,什么情况下用wincc服务器与客户端
  9. 蓝桥杯每日真题之货物摆放
  10. spark on yarn 完全分部署_听说你熟悉Flink-On-Yarn的部署模式?
  11. python矩阵连乘_第3章 动态规划——矩阵连乘最优计算方式查找
  12. linux 系统上开启uRPF
  13. Visual Paradigm 下载安装及使用
  14. 【强化学习】手把手教你实现游戏通关AI(2)——Q-Learning
  15. 为什么有的人赚钱很简单,有的人却不行?
  16. 万兆局域网方案_家庭万兆方案性价比之选,10G网速不是梦!
  17. 计算机科学与技术专业图书,《计算机科学与技术专业毕业论文选》—甲虎网一站式图书批发平台...
  18. Linux基础 linux账号及权限管理
  19. 困惑了很久的函数D3DXCreateTextureFromFileInMemoryEx
  20. Sqlserver 中临时表和全局临时表

热门文章

  1. linux自定义服务
  2. matlab 图例自定义,matlab中如何自定义图例_常见问题解析
  3. String.format(“0:D2}“,a)字符串格式化
  4. 普通函数和Generator函数递归获取嵌套数组的最大值
  5. py樱花代码_武汉大学生用代码敲出樱花绽放,这个开源项目也很酷炫
  6. springboot项目打包成jar包
  7. 上面两点下面一个三角形_【人人都能欣赏的数学证明】为什么三角形的三个内角相加是180度?...
  8. mysql如果空显示_mysql按照自己定义的值显示如果为空的就显示0
  9. oracle:sql介绍及SQL基本查询 lt;四gt;
  10. CentOS7上实现Squid缓存服务器的两种模式