`
kennethf6986
  • 浏览: 67187 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

c++基础之头文件

阅读更多
头文件的作用
早期的编程语言如Basic、Fortran没有头文件的概念,C++/C语言的初学者虽然会用使用头文件,但常常不明其理。这里对头文件
的作用略作解释:
(1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用
户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。
(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这
一简单的规则能大大减轻程序员调试、改错的负担。


一般来说,头文件提供接口,源文件提供实现。但是有些实现比较简单的,也可以直接写在头文件里,这样头文件接口实现一起提供。

在编译时,源文件里的实现会被编译成临时文件,运行时刻程序找到头文件里的接口,根据接口找到这些临时文件,来调用它们这些实现。

之所以在 C++ 中要使用头文件,最主要的原因是 C++ 的同一个项目可能有多个源代码文件,要命的是这些源代码是分别单独编译的。

也就是说,在编译其中一个文件时,编译器并不知道其它文件中定义的内容,如类、全局变量等。

这就要求我们必须在要使用某个类、函数或变量的每个文件中声明它,否则 C++ 是无法找到它的。



很多文件可能都需要使用加法。假设有一个文件 b.cpp 需要使用这个函数,那么,它必须先声明它,虽然不需要再重写。



如果有很多文件都要使用这个函数,那么这会变得麻烦,特别的,如果你写了一个类,那么你需要维护大量的声明(对于每一个 public 对象),并且如果你的类的定义发生了改变,你可能不得不改变无数个声明。

所以,C++ 语言提出了头文件的概念。你只需要在头文件中声明一次,在实现文件中定义一次,在所有需要用的文件中,就只需要引用这个头文件,相当于每个文件都包含了一个声明。

为了防止头文件的重复包含,通常应该使用预处理指令 #define (定义符号)、#ifndef(如果没有定义)、#endif(结束判断)来书写头文件的内容。

请理解如下的例子,它是对上个笔记中的 Xiao 类的改进。

如同名字一样的意思,NameSpace:名字空间,之所以出来这样一个东西,是因为人类可用的单词数太少,并且不同的人写的程序不可能所有的变量都没有重名现象,对于库来说,这个问题尤其严重,如果两个人写的库文件中出现同名的变量或函数(不可避免),使用起来就有问题了,为了解决这个问题,引入了名字空间这个概念,通过使用using namespace xxx;你所使用的库函数或变量就是在该名字空间中定义的.这样以来就不会引起不必要的冲突了.
     所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
     一 :<iostream>和<iostream.h>格式不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。 因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。

因为标准库非常的庞大,所程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都被放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。 using namespace std;是定义全局空间。

c++中的头文件#include<iostream>等引用时必须加using namespace std;不加的话,需要有std::cout这样的形式来引用库中的内容。而C中的则不必如#include<string.h>和#include<cstring>效果相同。


名字空间,实质上也是为了方便程序在不同平台上正确的运行。
---------------------------------------------------------------

namespace是为了解决C++中的名字冲突而引入的。
什么是名字冲突呢?比如,在文件x.h中有个类MyClass,
在文件y.h中也有个类MyClass,而在文件z.cpp中要同时
引用x.h和y.h文件。显然,按通常的方法是行不能的,
那怎么办呢?引入namespace即可。例如:
       在x.h中的内容为
// x.h
namespace MyNamespace1
{
   class MyClass
   {
   public:
       void f();
   private:
       int m;
   }
};

       在y.h中的内容为
// y.h
namespace MyNamespace2
{
   class MyClass
   {
   public:
       void f();
   private:
       int m;
   }
};

   然后在z.cpp中引入x.h和y.h
// z.cpp
#include "x.h"   
#include "y.h"   

void z::f()
{
   //声明一个文件x.h中类MyClass的实例x
   MyNamespace1::MyClass x;
     //声明一个文件x.h中类MyClass的实例x
   MyNamespace2::MyClass y;

   //调用文件x.h中的函数f
   x.f();
   //调用文件y.h中的函数f
   y.f();
}
       名字空间实质上是一个作用域。
分享到:
评论

相关推荐

    C++基础教学所有头文件

    C++基础教学所有头文件

    c++头文件实现无第三方依赖基础库

    c++头文件实现无第三方依赖基础库

    linux中常用C和C++一些头文件的作用

    linux中常用C/C++一些头文件的作用 1、 一些头文件的作用: #include &lt;assert.h&gt;:ANSI C。提供断言,assert(表达式) #include &lt;glib.h&gt;:GCC。GTK,GNOME的基础库,提供很多有用的函数,如有数据结构操作函数。...

    分数类 c++代码 头文件

    设计该分数类实现分数之间的基础运算,该类的编写用到了类模板和函数模板知识,该类实现了分数之间的加减乘除运算,重载了+、-、*、/运算符。 用C++语言编写。包含一个分数类的头文件和该类的实现文件。 希望该资源...

    c++ standalone header-only basic library. - c++头文件实现无第三方依赖基础库

    c 头文件 c++ standalone header-only basic library. || c++头文件实现无第三方依赖基础库

    C++中头文件的概念与基本编写方法

    主要介绍了C++中头文件的概念与基本编写方法,是C++入门学习中的基础知识,需要的朋友可以参考下

    c++基础总结

    c++基础知识总结,适合初学者 1 static(静态)变量有什么作用 3个体明显的作用:1)在函数体内,静态变量具有“记忆”功能,即一个被声明为静态变量在一个函数被调用的过程中其值维持不变2)在模块内,它的作用域...

    C++基础知识 挺不错的

    另外,C语言中的头文件都是以.h结尾的,而标准的C++提倡使用没有扩展名的头文件。 第四行让我们可以在程序中直接使用std名字空间内的标识符。std名字空间包含了所有标准C++提供的类和函数,为了简便起见,一般总在...

    OpenGL头文件和库文件

    c++ 所需要的Opengl 头文件,lib文件和动态链接库,囊括了所有你会用到的Opengl文件 (不包括glew扩展)

    小熊猫c++开发工具(Dev-C++升级版本)免安装版本

    因为教学的需要,作者从2012年开始接触和使用这个编辑器,并在其停止更新后决定在其基础上继续更新,并命名为小熊猫Dev-C++。 目前已经修改和完善的功能亮点包括: 优化改进代码补全提示功能: 随输入自动显示补全...

    大数运算头文件(免费!!)

    C++大数运算头文件,有基础的加减乘除取余运算(不支持小数和负数运算!!),懒人必备. (使用VS2019的程序猿无需担心下面的警告,不影响正常使用)

    大于计算机字长的大数头文件

    本头文件用C++语言,实现了大数(长度大于计算机字长的数)的各种运算,已经封装在类里面了,大家看看头文件就知道应该怎么用啦,只要你有C++语言的基础就可以啦~很方便的哦

    myview demo

    通过一个自定义view类调用一个自定义model类的基础应用,简单实现了MVC

    基于Linux的C++ 教程合集, 包括C++基础, C++服务器, C++专题.rar

    #include //包含库头文件 //主程序入口 int main() { std::cout&lt; std::cout&lt; return 0; } 源代码编辑传送完毕后打开远程SCRT软件连接至Linux服务器,cd到指定目录后使用g++编译器编译代码文件,其编译命令...

    C/C++头文件一览

    C/C++头文件一览

    C++基础知识详解与重点

    C++基础知识 一、#include “filename.h”和#include 的区别 二、头文件的作用 三、* , &修饰符的位置

    cpp2uml:解析c++头文件制作uml图

    解析c++头文件制作uml图 这个lua脚本输出了一个用于生成uml图的plantuml脚本 用法: $ find ~/Project/AwesomeCppProject/ -name *.h | ./cpp2uml.lua | Plantuml -pipe &gt; uml.png 植物UML PlantUMLi 是一个组件...

    C++语言基础教程吕凤煮著

    一、C++文件的构成 1、头文件 在创建MFC应用时,类向导会为每个头文件添加宏定义,例如: #if !defined(AFX_ODBCVIEW_H__B82AC4A2_3DBE_4A29_A549_F9939BE498E3__INCLUDED_) #define AFX_ODBCVIEW_H__B82AC4A2_3...

    c/c++用一个源文件,一个头文件实现的线程池源码,包含测试代码,可运行

    c/c++用一个源文件,一个头文件实现的线程池源码,包含测试代码,可运行。 说明: 1、线程池初始化时,会起多个独立线程作为线程池的work进程; 2、可修改线程池的work线程数量,需要简单修改下接口即可; 3、可设置...

    c++编程11个重点

    c++ 的11个要点[转贴] 基础知识 下面的这些要点是对所有的C++程序员都适用的。我之所以说它们是最重要 的,是因为这些要点中提到的是你通常在C++书中或网站上无法找到的。如:指向 成员的指针,这是许多资料中都不...

Global site tag (gtag.js) - Google Analytics