namespace的用法

C++中采用的是单一的全局变量命名空间。在这单一的空间中,如果有两个变量或函数的名字完全相同,就会出现冲突。当然,你也可以使用不同的名字,但有时我们并不知道另一个变量也使用完全相同的名字;有时为了程序的方便,必需使用同一名字。比如你定义了一个变量string
user_name,
有可能在你调用的某个库文件或另外的程序代码中也定义了相同名字的变量,这就会出现冲突。命名空间就是为解决C++中的变量、函数的命名冲突而服务的。解决的办法就是将你的strTemp变量定义在一个不同名字的命名空间中。就好像张家有电视机,李家也有同样型号的电视机,但我们能区分清楚,就是因为他们分属不同的家庭。

例如:

#include <iostream>
#include
<string>
using namespace
std;

//using
namespace编译指示,使在C++标准类库中定义的名字在本程序中可以使用
//否则,iostream,string
等c++标准类就不可见了,编译就会出错。
//两个在不同命名空间中定义的名字相同的变量

namespace
myown1{
    string
user_name = "myown1";
}

namespace
myown2{
    string
user_name = "myown2";
}

int
main()
{
    cout<<
"/n"
    <<
"Hello, " 
    <<
myown1::user_name //用命名空间限制符myown1访问变量user_name
    <<
"... and goodbye!/n";

    cout<<
"/n"
    <<
"Hello, " 
    <<
myown2::user_name //用命名空间限制符myown2访问变量user_name
    << "... and
goodbye!/n";

    return
0;
}

  当然,我们也可以使用程序开头的预编译指示来使用命名空间中的名字。使用预编译指示的好处在于在程序中不必显式地使用命名空间限制符来访问变量。以上主程序可修改为: 

int
main()
{
    using namespace
myown1;
    cout<<
"/n"
    << "Hello,

    <<
user_name 
    <<
"... and goodbye!/n";

    // using namespace
myown2;
    cout<<
"/n"
    << "Hello,

    <<
myown2::user_name //用命名空间限制符myown2访问变量user_name
    <<
"... and goodbye!/n";

    return
0;
}

  但第二个变量必需用命名空间限制符来访问,因为此时myown1空间中的变量已经可见,如果不加限制,编译器就会无法识别是那一个命名空间中的变量。这一点一定要注意。
以上只是初学者不清楚的一个概念,在以后的文章中还将继续讨论其它的一些概念。

下面写一段完整的程序来表明这个函数的用法:


 1 #include<iostream>
2 using namespace std;
3
4
5 namespace Cui{
6 void Love()
7 {
8 cout<<"He love a wonderful girl, and her name is SHILI"<<endl;
9 }
10 }
11
12 using namespace Cui;
13
14 int main()
15 {
16 int a=10;
17 cout<<a<<endl;
18 Love();
19 Cui::Love();//调用方式2
20 return 0;
21 }

转自 : http://www.cnblogs.com/CBDoctor/archive/2011/12/05/2276563.html

时间: 2024-08-06 16:22:42

namespace的用法的相关文章

c++ namespace简单用法

提供一个小例子,例子来源于<c++程序设计语言>,总共包含3个文件,分别是命名空间声明的文件Stack.h,命名空间的实现文件Stack.cpp,以及命名空间的使用文件main.c 下面是相关代码: Stack.h: 1 namespace Stack{ 2 void push(int e); 3 int pop(); 4 } Stack.cpp: 1 #include"stack.h" 2 3 namespace Stack{ 4 const int max_size=1

C++ 之namespace常见用法

一.背景 需要使用Visual studio的C++,此篇对namespace的常用用法做个记录. 二.正文 namespace通常用来给类或者函数做个区间定义,以使编译器能准确定位到适合的类或者函数. 譬如说,自行实现了一个函数test(void),而在该项目的库函数内也定义了一个函数test(void); 当你调用test();函数的时候,编译器就困惑了,该调用哪个呢?这个时候namespace的作用就 显现出来了. namespace的定义用法: namespace namespace_n

C++中namespace的用法理解

最近在学习学习大疆OSDK开发,本人只学过C语言,对于C++中的一些用法不是很熟悉,在这里记录一下自己学习过程: 命名空间namespace一般用来给类或者函数做区间定义,从而使编译器能准确定位到适合的类或者函数.比如自行定义了一个函数test(void),而在该项目的库函数内也定义了一个函数test(void);当你调用test();函数的时候,编译器便不知道该调用哪个,从而引发错误,这个时候namespace的作用就显现出来了. namespace的定义用法: 1 namespace nam

Mybatis高级查询之关联查询

3 关联查询 做查询之前,先修改几个配置.mapper.xml是在mybatis-config.xml中指定,那么我们每增加一个mapper都要增加一个配置,很麻烦.为了简化配置.需要将mapper接口和mapper.xml放到同一个文件下,并且接口和xml文件命名一致.使用mybatis的自动扫描:.这样,当我们新增接口的时候,直接创建接口和对应xml文件就可以了: <mappers> <!--<mapper resource="com.test.mapper.dao/

跟着视频学 c# asp.net 第三天

课程要点: if 的用法swith的用法 case 后面必须是一个固定的值,不能是表达式,不能是bool运算符 最后要有break 除非是 case "1" case "2" 合并while 如果while 后的条件表达式为true就不断执行执行{}中的代码 for(code1;code2;code3).code1:循环的初始化代码,只在循环开始之前运行一次:code2,bool类型的表达式,每次循环完成前都判断一下是否为true,只有为true才会进行本次循环:c

C++编译单元和命名空间

编译单元 编译单元,指的是代码的物理组织形式.根据C++标准,每一个cpp 文件就是一个编译单元. 编译器不会去编译 `.h` 或者 `.hpp` 文件: 编译器只会编译 `.c` 或 `.cpp` 文件: 简单来说,当一个c或cpp文件在编译时,预处理器首先递归包含头文件,这也就是为什么常会有:#ifndef--#define--#endif.之后,形成一个含有所有必要信息的单个源文件,这个源文件就是一个编译单元.这个编译单元会被编译成为一个与cpp文件名同名的目标文件 . 编译器不能检查跨越

(转)struts2.0配置文件、常量配置详解

一.配置: 在struts2中配置常量的方式有三种: 在struts.xml文件中配置 在web.xml文件中配置 在sturts.propreties文件中配置 1.之所以使用struts.propreties文件配置,是因为为了保持与WebWork的向后兼容 2.在实际开发中,在web.xml中配置常量相比其他两种,需要更多的代码量,会降低了web.xml的可读性 3.通常推荐在struts.xml文件中配置struts2的常量,而且便于集中管理 sturt2中搜索加载常量的顺序是: str

struts2知识总结

2.Struts2和Servlet的对比 3.Struts2程序运行流程 4.Struts2的配置文件包括自己内部的.properties.default.xml以及自定义的配置文件struts.xml和web.xml先加载内部自己的配置文件,后加载用户自定义的配置文件,后加载的会覆盖先加载的文件. 在web.xml中会配置struts2的前端控制器(StrutsPrepareAndExecuteFilter)<?xml version="1.0" encoding="

action script3.0殿堂之路.pdf 读书笔记

1.显示列表API:springshapemovieClipsprite---------------声明变量:不常用的定义方式:var h;//未指定类型,默认为untypedvar g:*;//跟上面是一样的效果 uint number int 的使用要注意,可能计算出来的值不是你想像中的值,比喻:var float:Number =0;for:10次-> float += 0.1;得到的是0.999999999999;-------------------------判断String类型转