C++语言引入命名空间(Namespace)这一概念主要是为了避免命名冲突,其关键字为 namespace。

科技发展到如今,一个系统通常都不会仅由一个人来开发完成,不同的人开发同一个系统,不可避免地会出现变量或函数的命名冲突,当所有人的代码测试通过,没有问题时,将所有人的代码结合到一起,因为变量或函数重名而导致的问题将会造成一定的混乱,例如:

    int  flag = ;          //小李声明的变量
// …… //中间间隔若干行代码
bool flag = true; //小韩声明的变量 注意:此例仅为解释命名空间所用,在公司的系统开发中并非如此中所述,完全仅靠命名空间来解决命名冲突的,具体编程规范可以参考林锐的《高质量程序设计指南》一书。 如上所示,因为个人习惯不同,小李喜欢声明int型变量用于逻辑判断,而小韩则更喜欢采用bool类型变量。但两个声明放到同一个函数中的时候,很明显编译器会提示出flag变量重新定义的错误。这种问题若不加以处理是无法编译通过的。 可以使用命名空间解决类似上面的命名冲突问题,例如: namespace Li
{
//小李的变量声明
int flag = ;
} namespace Han
{ //小韩的变量声明
bool flag = true;
} 小李与小韩各自定义了以自己姓氏为名的命名空间,此时将小李与小韩的flag变量定义再置于同一个函数体中,则不会有任何问题,当然在使用这两个变量的时候需要指明所采用的是哪一个命名空间中的flag变量。 指定所使用的变量时需要用到“::”操作符,“::”操作符是域解析操作符。例如:
Li::flag = ; //使用小李定义的变量flag
Han::flag = false; //使用小韩定义的变量flag 我们已经定义了两个命名空间Li和Han,并在其中各自声明flag变量,使用的时候则需要分别用域解析操作符指明此时用的flag变量是谁定义出来的flag变量,是小韩还是小李定义的。 除了直接使用域解析操作符,还可以采用using声明(using declaration),例如:
using Li::flag;
flag = ; //使用小李定义的变量flag
Han::flag = false; //使用小韩定义的变量flag 在代码的开头用using声明了Li::flag,其含义是using声明以后的程序中如果出现未指明的flag时,则使用Li::flag,但是若要使用小韩定义的flag,则仍需要Han::flag。 using声明不仅仅可以针对命名空间中的一个变量,也可以用于声明整个命名空间,例如:
using namespace Li;
flag = ; //使用小李定义的变量flag
Han::flag = false; //使用小韩定义的变量flag 如果命名空间Li中还定义了其他的变量,则同样具有flag变量的效果,在using声明后,若出现未具体指定命名空间的命名冲突变量,则默认采用Li命名空间中的变量。 命名空间内部不仅可以声明或定义变量,对于其它能在命名空间以外声明或定义的实体,同样也都能在命名空间内部进行声明或定义,例如变量的声明或定义、函数的声明或定义、typedef等都可以出现在命名空间中。 下面我们来看一个简单的C++程序的示例:
#include<iostream>
using namespace std; int main()
{
cout << "hello world!" << endl;
return ;
} 这是一个简单的C++程序hello world示例,在程序中采用了using声明命名空间std,using namespace std; 这一语句涵盖了std命名空间中的所有标识符,而该命名空间包含C++所有标准库。头文件iostream文件中定义的所有变量、函数等都位于std命名空间中,每次使用iostream中的变量或函数都需要在前面加上std::是非常麻烦的一件事,为此可直接用using声明将std中的所有变量或函数等都声明出来。 如果不用using namespace std;这一语句,则程序应该像下面这样: #include<iostream> int main()
{
std::cout<<"hello world!"<<std::endl;
return ;
} 这样看起来是相当麻烦的,如果在某次使用iostream中变量或函数时漏掉std则会导致为定义标识符错误。 C++语言是以C语言为基础的,它继承了所有的C语言函数库,但C++对这些标准库都重新命名了。标准C头文件(如math.h)重命名为cmath,去掉头文件的.h,并在前面加上c。因此在C++中如需使用math.h头文件则可以按照如下方式使用。
#include<cmath>
using namespace std;

C++基础学习2:命名空间的更多相关文章

  1. C#/.NET 基础学习

    初识C# C#是微软公司发布的面向对象的.运行于.NET Framework之上的高级程序设计语言.与Java有着明显不同,借鉴Delphi的特点,与COM(组件对象模型)直接集成,是微软公司 .NE ...

  2. salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值

    注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...

  3. C++基础学习_01

    C++基础学习_01 基础知识:1.命名空间,2.IO流(输入输入),3.参数缺省,4.函数重载 1.命名空间 作用:对标识符的名称进行本地化,避免命名冲突 定义:namaspace space_na ...

  4. C#RabbitMQ基础学习笔记

    RabbitMQ基础学习笔记(C#代码示例) 一.定义: MQ是MessageQueue,消息队列的简称(是流行的开源消息队列系统,利用erlang语言开发).MQ是一种应用程序对应用程序的通信方法. ...

  5. MVC+Ext.net零基础学习记录(五)

    继MVC+Ext.net零基础学习记录(四),在后面我在既有的项目上又添加了一个子项目,还用前面提到的方法,进行主项目中引用DLL,然后子项目中生成事件中使用mkdir 进行拷贝 发现一个下午就总是报 ...

  6. C++基础 学习笔记之一:源代码的格式化

    C++基础 学习笔记之一:源代码的格式化 1. 源代码中的标记与空白 C++中的语句是以分号表示语句的结束.在C++中空格和回车以及制表符均为相同作用,即三者通常可以互相替代. 例如可以将一个简单的m ...

  7. salesforce 零基础学习(五十二)Trigger使用篇(二)

    第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...

  8. 如何从零基础学习VR

    转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 近期很多搞技术的朋友问我,如何步入VR的圈子?如何从零基础系统性的学习VR技术? 本人将于2017年1月 ...

  9. IOS基础学习-2: UIButton

    IOS基础学习-2: UIButton   UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...

  10. HTML5零基础学习Web前端需要知道哪些?

    HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...

随机推荐

  1. 【转】火狐浏览器中firebug插件的时间线域解释

      又到了上图时间了..对照这张图,各个时间所对应的意义就很简单明了.   阻挡(Blocking):每个浏览器有并发连接数量的上限(例如Firefox对每个host限制6个连接),如果当前建立的连接 ...

  2. Flash在线签名小程序,可回放,动态导出gif图片

    需求: 公司为了使得和客户领导签字的时候记录下来,签字过程,可以以后动态回放演示,最好是gif图片,在网页上也容易展示,文件也小. 解决过程: 始我们去寻找各种app,最终也没有找到合适的,后来我在f ...

  3. Celery-4.1 用户指南: Workers Guide (Workers 指南)

    启动工作单元 你可以通过执行以下命令在前台启动工作单元: $ celery -A proj worker -l info 查看启动工作单元的可用命令行选项,可以执行: $ celery worker ...

  4. mysql的默认隔离级别

    原文:https://www.cnblogs.com/rjzheng/p/10510174.html 知识点总结 ------------------------------------------- ...

  5. 蓝牙服务 UUID

    https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx 手机蓝牙对手机 ,华为平板取红米手机 8 个Audio So ...

  6. 我的第一个Socket程序-SuperSocket使用入门(一)

    第一次使用Socket,遇到过坑,也涨过姿势,网上关于SuperSocket的教程基本都停留在官方给的简单demo上,实际使用还是会碰到一些问题,所以准备写两篇博客,分别来介绍SuperSocket以 ...

  7. loop

    -- ------------------------loop---------------------------delimiter $DROP PROCEDURE IF EXISTS my_cou ...

  8. 利用powerdesigner创建表模型后导出sql语句方法,以及报错 Generation aborted due to errors detected during the verification of the model.的解决办法

    今天用powerdesigner建了表模型,下面先说一下导出sql语句的步骤. 1.选项 2. 然后就报错了,下面说解决办法,很简单. 你没看错,把模型检查的√去掉就行了~~ 导出表名不带双引号的设置 ...

  9. Vue02 样式的动态绑定

    daigengxin......2018-3-8 21:09:18 跟angular2类似,分为CSS类绑定和Style样式绑定两种方式,详情参见

  10. 仿射变换详解 warpAffine

    转自 http://www.cnblogs.com/dupuleng/articles/4055020.html 博客园 首页 新随笔 联系 管理 订阅 随笔- 1  文章- 185  评论- 14  ...