C/C++知识点之C、C++命名空间
小标 2018-07-10 来源 : 阅读 567 评论 0

摘要:本文主要向大家介绍了C/C++知识点的C、C++命名空间,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点的C、C++命名空间,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。

标签: c++funheader语言stringc

分类: C/C Plus
[TOC]

本讲基本要求
+ 掌握:命名空间的作用及定义;如何使用命名空间。
+ 了解:使用早期的函数库

重点、难点
- 命名空间的作用及定义;如何使用命名空间。
- 在学习本书前面各章时,读者已经多次看到在程序中用了以下语句:

using namespace std;

   

这就是使用了命名空间std。在本讲中将对它作较详细的介绍。

一、 为什么需要命名空间(问题提出)

命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。
在C语言中定义了3个层次的作用域,即文件(编译单元)、函数和复合语句。C++又引入了类作用域,类是出现在文件内的。在不同的作用域中可以定义相同名字的变量,互不于扰,系统能够区别它们。

1、全局变量的作用域是整个程序,

在同一作用域中不应有两个或多个同名的实体(enuty),包括变量、函数和类等。
例:如果在文件中定义了两个类,在这两个类中可以有同名的函数。在引用时,为了区别,应该加上类名作为限定:

<code>class A     //声明A类

{ public:

   void funl();//声明A类中的funl函数

private:

    int i; };

void A::funl() //定义A类中的funl函数

{…………}

 

class B //声明B类

{ public:

    void funl(); //B类中也有funl函数

    void fun2(); };

void B::funl() //定义B类中的funl函数

{ …………}

</code>

   

这样不会发生混淆。

在文件中可以定义全局变量(global variable), 它的作用域是整个程序。如果在文件A中定义了一个变量a :
int a=3;
在文件B中可以再定义一个变量a:
int a=5;
在分别对文件A和文件B进行编译时不会有问题。但是,如果一个程序包括文件A和文件B,那么在进行连接时,会报告出错,因为在同一个程序中有两个同名的变量,认为是对变量的重复定义。
可以通过extern声明同一程序中的两个文件中的同名变量是同一个变量。如果在文件B中有以下声明:

<code>extern int a;</code>

   

表示文件B中的变量a是在其他文件中已定义的变量。由于有此声明,在程序编译和连接后,文件A的变量a的作用域扩展到了文件B。如果在文件B中不再对a赋值,则在文件B中用以下语句输出的是文件A中变量a的值: cout<

2、程序中就会出现名字冲突。

在简单的程序设计中,只要人们小心注意,可以争取不发生错误。但是,一个大型的应用软件,往往不是由一个人独立完成的,而是由若干人合作完成的,不同的人分别完成不同的部分,最后组合成一个完整的程序。假如不同的人分别定义了类,放在不同的头文件中,在主文件(包含主函数的文件)需要用这些类时,就用#include命令行将这些头文件包含进来。由于各头文件是由不同的人设计的,有可能在不同的头文件中用了相同的名字来命名所定义的类或函数。
例4 名字冲突
程序员甲在头文件headerl.h中定义了类Student和函数fun。

<code>//例4中的头文件header1(头文件1,设其文件名为cc8-4-h1.h)

#include <string>

#include <cmath>

using namespace std;

class Student //声明Student类

   { public:

     Student(int n,string nam,int a)

       { num=n;name=nam;age=a;}

     void get_data();

   private:

     int num;

     string name;

     int age; };

void Student::get_data() //成员函数定义

{ cout<<num<<" 1="" 1.41421="" 101="" 102="" 18="" 2="" 2.82843="" 5="" :="" ansi="" char="" class="brush:java;" const="" double="" f="" file="" fun="" global="" h2="" h3="" header1.h="" header2="" header2.h="" id="3使用using-namespace命名空间名" include="" int="" iostream="" l="" l9="" li="" main="" namespace="" namespacens2="" nanlespace="" ns1="" ns1::student="" ns2="" ns2::student="" nsl="" nsl::="" nsl::student="" num="n;name=nam;sex=s;}" pre="" private:="" public:="" qualified="" rate="0.08;" return="" string="" stud2="" student="" studl="" studt="" television="" tv="Television;" using="" void="" wang=""><p>因为在同一作用域中同时引入了两个命名空间nsl和ns2,其中有同名的类和函数。在出现Student时,无法判定是哪个命名空间中的Student,出现二义性,编译出错。==因此只有在使用命名空间数量很少,以及确保这些命名空间中没有同名成员时才用using namespace语句。==</p><h2 id="五-无名的命名空间">五、 无名的命名空间</h2><p>以上介绍的是有名字的命名空间,C++还允许使用没有名字的命名空间,如在文件A中声明了以下的无名命名空间:</p><pre class="brush:java;">//可以用于编写文件的私有成员

namespace //命名空间没有名字 

{ void fun( ) //定义命名空间成员 

{ cout<<"OK."<<endl;} pre=""><p>由于命名空间没有名字,在其他文件中显然无法引用,它只在本文件的作用域内有效。无名命名空间的成员fun函数的作用域为文件A(确切地说,是从声明无名命名空间的位置开始到文件A结束)。==在文件A中使用无名命名空间的成员,不必(也无法)用命名空间名限定。使用有名空间必须限定==

 

如果在文件A中有以下语句:</p><pre class="brush:java;">fun();</pre>

<p>则执行无名命名空间中的成员fun函数,输出”OK.”。<br>

在本程序中的其他文件中也无法使用该fun函数,也就是把fun函数的作用域限制在本文件范围中。可以联想到:在C浯言中可以用static声明一个函数,其作用也是使该函数的作用域限于本文件。C++保留了用static声明函数的用法,同时提供了用无名命名空间来实现这一功能。随着越来越多的C++编译系统实现了ANSI C++建议的命名空间的机制,相信使用无名命名空间成员的方法将会取代以前习惯用的对全局变量的静态声明。</p>

<h2 id="六标准命名空间std">六、标准命名空间std</h2>

<p>为了解决C++标准库中的标识符与程序中的全局标识符之间以及不同库中的标识符之间的同名冲突,应该将不同库的标识符在不同的命名空间中定义(或声明)。标准C++库的所有的标识符都是在一个名为std的命名空间中定义的,或者说标准头文件(如iostream)中函数、类、对象和类模板是在命名空间std中定义的。std是standard(标准)的缩写,表示这是存放标准库的有关内容的命名空间,含义请楚,不必死记。<br>

这样,在程序中用到C++标准库时,需要使用std作为限定。如<br>

std::cout<<”OK.”<</p>

<pre class="brush:java;">using namespace std;</pre>

<p>这样,在std中定义和声明的所有标识符在本文件中都可以作为全局量来使用。但是应当绝对保证在程序中不出现与命名空间std的成员同名的标识符,例如在程序中不能再定义一个名为cout的对象。由于在命名空间std中定义的实体实在太多,有时程序设计人员也弄不请哪些标识符已在命名空间std中定义过,为减少出错机会,有的专业人员喜欢用若干个”using命名空间成员”声明来代替“using namespace命名空间”声明,如</p>

<pre class="brush:java;">using Std::string;

using Std::cout;

using Std::cin;</pre>

<p>为了减少在每一个程序中都要重复书写以亡的using声明,程序开发者往往把编写应用程序时经常会用到的命名空间std成员的usmg声明组成一个头文件,然后在程序中包含此头文件即可。<br>

如果阅读了多种介绍C++的书,可能会发现有的书的程序中有using namespace语句,有的则没有。有的读者会提出:究竟应该有还是应该没有?应当说:用标准的C++编程,是应该对命名空间std的成员进行声明或限定的(可以采取前面介绍过的任一种方法)。但是目前所用的C++库大多是几年前开发的,当时并没有命名空间,库中的有关内容也没有放在std命名空间中,因而在程序中不必对std进行声明。</p>

<h2 id="七-使用早期的函数库">七、 使用早期的函数库</h2>

<p>C语言程序中各种功能基本上都是由函数来实现的,在C语言的发展过程中建立了功能丰富的函数库,C++从C语言继承了这份宝贵的财富。在C++程序中可以使用C语言的函数库。<br>

如果要用函数库中的函数,就必须在程序文件中包含有关的头文件,在不同的头文件中,包含了不同的函数的声明。<br>

在C++中使用这些头文件有两种方法。</p>

<h3 id="1用c语言的传统方法">1、用C语言的传统方法</h3>

<p>头文件名包括后缀.h,如stdio.h,math.h等。 ==由于C语言没有命名空间,头文件并不存放在命名空间中,==因此在C++程序文件中如果用到带后缀==.h的头文件时,不必用命名空间。只需在文件中包含所用的头文件即可==。如</p>

<pre class="brush:java;">#include<math.h></math.h></pre>

<h3 id="2用c的新方法">2、用C++的新方法</h3>

<p>C++标准要求系统提供的头文件不包括后缀.h,例如iostream、string。为了表示与C语言的头文件有联系又有区别,C++所用的头文件名是在C语言的相应的头文件名(但不包括后缀.h)之前加一字母c。例如,C语言中有关输入与输出的头文件名为stdio.h在C++中相应的头文件名为cstdio。C语言中的头文件math.h,在C++中相应的头文什名为cmath。C语言中的头文件string.h在C++中相应的头文件名为cstring。注意在C++中,头文件cstnng和头文件strmg不是同一个文件。前者提供C语言中对字符串处理的有关函数(如strcmp,ctrcpy)的声明,后者提供C++中对字符串处理的新功能。<br>

此外,由于这些函数都是在命名空间std中声明的,因此在程序中要对命名空间std作声明。如:</p>

<pre class="brush:java;">#include<cstdio> 

#include<cmath> 

using namespace std;</cmath></cstdio></pre>

<p>目前所用的大多数C++编译系统既保留了c的用法,又提供丁C++的新方法。下面两种用法等价,可以任选。<br>

C传统方法 C++新方法</p>

<pre class="brush:java;">#include<stdio.h> #include<cstdio>

#include<math.h> #include<cmath>

#include<string.h> #include<cstring>

using namespace std;</cstring></string.h></cmath></math.h></cstdio></stdio.h></pre>

<p>可以使用传统的c方法,但应当提倡使用C++的新方法。</p>

</endl;}></pre>

</num<<"></cmath></string></code>

以上就介绍了C/C+的相关知识,希望对C/C+有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言C/C+频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程