1.什么是命名空间:

  命名空间实际上就是一个由程序设计者命名的内存区域,程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来。

2.命名空间的作用:

  命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。

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

3.命名空间的定义和基本使用方法:

#include <iostream>
using namespace std;
// 在声明一个命名空间时,花括号内不仅可以包括变量,而且还可以包括以下类型:
// ·变量(可以带有初始化);
// ·常量;
// ·数(可以是定义或声明);
// ·结构体;
// ·类;
// ·模板;
// ·命名空间(在一个命名空间中又定义一个命名空间,即嵌套的命名空间)。
// 例如
namespace NS
{
const double RATE=0.08; //常量
double pay = ; //变量
double tax() //函数
{
return pay * RATE;
}
namespace InterNS //嵌套的命名空间
{
int age = ;
}
} //如果想输出命名空间NS中成员的数据,可以采用下面的方法:
void func()
{
cout<<NS::RATE<<endl;
cout<<NS::pay<<endl;
cout<<NS::tax()<<endl;
cout<<NS::InterNS::age<<endl; //需要指定外层的和内层的命名中间名 } int main()
{
func();
//pay = 1000; //error C2065: “pay”: 未声明的标识符
while();
return ;
}
//
// 0.08
// 200
// 16
//

4.利用命名空间来解决程序名字冲突问题实例:

#include <iostream>
using namespace std;
//-------------------------------------------------------------
//header1.h
#ifndef HEADER1_H_
#define HEADER1_H_
using namespace std;
#include <string>
#include <cmath>
namespace ns1
{
class 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: " <<num << " name: "<< name<<" age: "<<age<< endl;
} double fun(double a,double b)//命名空间中的方法
{
return sqrt(a + b);
}
} #endif /* HEADER1_H_ */
//------------------------------------------------------------- //header2.h
#ifndef HEADER2_H_
#define HEADER2_H_ #include <cmath>
namespace ns2
{
class Student//同名的类
{
public : Student(int n,string nam, char s)
: num(n),
name(nam),
sex(s)
{
};
void get_data();
private:
int num;
string name;
char sex;
}; void Student::get_data()
{
cout << "num: " << num << " name: " <<name<< " sex: "<<sex << endl;
} double fun(double a,double b) //同名的方法
{
return sqrt(a - b);
}
} #endif /* HEADER2_H_ */
//-------------------------------------------------------------
# include <iostream>
# include "header1.h"
# include "header2.h"
int main()
{
ns1 :: Student stud1(,"xiaobao",); //
stud1.get_data();
cout <<"n1::fun(a8,4) = "<< ns1 :: fun(,) << endl; ns2 :: Student stud2(,"xiaobei",'m');
stud2.get_data();
cout <<"n2::fun(a8,4) = "<< ns2:: fun(,) << endl; while();
return ;
} // num: 10086 name: xiaobao age: 18
// n1::fun(a8,4) = 3.4641 // num: 10087 name: xiaobei sex: m
// n2::fun(a8,4) = 2

5.使用命名空间的方法:

  // 1、使用命名空间名::命名空间成员名[上面已讲]

#include <iostream>
using namespace std;
namespace Television //声明命名空间,名为Television
{
void show()
{
cout<<"showing..."<<endl;
}
}
namespace TV=Television;//别名,等同于本名 int main()
{
Television::show();//使用命名空间名::命名空间成员名
//TV::show();//同上 while();
return ;
}
//showing...

  // 2、使用命名空间别名

namespace Television //声明命名空间,名为Television
{
void show()
{
cout<<"showing..."<<endl;
}
}
namespace TV=Television; int main()
{
TV::show();
while(1);
return 0 ;
}
//showing...

  // 3、使用using 命名空间::成员

#include <iostream>
using namespace std;
namespace Television //声明命名空间,名为Television
{
void show()
{
cout<<"showing..."<<endl;
}
}
namespace TV=Television; using TV::show; //使用using 命名空间成员名
int main()
{
show();//这里就可以不在加上命名空间作用域了 while();
return ;
}
//showing...

  // 4、使用using namespace 命名空间名

#include <iostream>
using namespace std;
namespace Television //声明命名空间,名为Television
{
void show()
{
cout<<"showing..."<<endl;
}
}
namespace TV=Television; using namespace TV;
int main()
{
show(); while(1);
return 0 ;
}
//showing...

在使用using namespace命名空间名的情况下,如果在同一作用域中同时引入了两个命名空间nsl和ns2,其中有同名的类和函数。在出现Student时,无法判定是哪个命名空间中的 Student,出现二义性,编译出错。因此只有在使用命名空间数量很少,以及确保这些命名空间中没有同名成员时才用using namespace语句。[错误范例,代码如下:]

//-------------------------------------------------------------
//header1.h
#ifndef HEADER1_H_
#define HEADER1_H_
using namespace std;
#include <string>
#include <cmath>
namespace ns1
{
class 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: " <<num << " name: "<< name<<" age: "<<age<< endl;
} double fun(double a,double b)//命名空间中的方法
{
return sqrt(a + b);
}
} #endif /* HEADER1_H_ */
//------------------------------------------------------------- //header2.h
#ifndef HEADER2_H_
#define HEADER2_H_ #include <cmath>
namespace ns2
{
class Student//同名的类
{
public : Student(int n,string nam, char s)
: num(n),
name(nam),
sex(s)
{
};
void get_data();
private:
int num;
string name;
char sex;
}; void Student::get_data()
{
cout << "num: " << num << " name: " <<name<< " sex: "<<sex << endl;
} double fun(double a,double b) //同名的方法
{
return sqrt(a - b);
}
} #endif /* HEADER2_H_ */
//-------------------------------------------------------------
# include <iostream>
# include "header1.h"
# include "header2.h"
int main()
{
using namespace ns1;
using namespace ns2;//冲突 Student stud1(,"xiaobao",); // error C2872: “Student”: 不明确的符号
stud1.get_data();
cout <<"n1::fun(a8,4) = "<< ns1 :: fun(,) << endl; Student stud2(,"xiaobei",'m');// error C2872: “Student”: 不明确的符号
stud2.get_data();
cout <<"n2::fun(a8,4) = "<< ns2:: fun(,) << endl; while();
return ;
}

6、无名的命名空间

  无名命名空间作用域 : 确切地说,是从声明无名命名空间的位置开始到本文件结束。

  在文件中使用无名命名空间的成员,不必(也无法)用命名空间名限定。

//有名的命名空间
namespace EX_NS
{
void show()
{
cout<<"ex showing..."<<endl;
}
} // 命名空间没有名字,在其他文件中显然无法引用,它只在本文件的作用域内有效。
// 无名命名空间的成员作用域:确切地说,是从声明无名命名空间的位置开始到文件结束。
// 在文件A中使用无名命名空间的成员,不必(也无法)用命名空间名限定。 //无名命名空间
namespace
{
void show()
{
cout<<"showing..."<<endl;
}
}
void func(void)
{
EX_NS::show();
show();//要使用无名命名空间,func不能再它之前定义。
} int main()
{
func();
while();
return ;
}

  下面这样是错误的:

using namespace EX_NS ;
void func(void)
{
EX_NS::show();
show(); //error C2668: “EX_NS::show”: 对重载函数的调用不明确
}

7、因为多个命名空间可能有相同成员,除了std之外,在使用命名空间较多的情况下,一般不直接using namespace 命名空间。也一般不直接使用无名的命名空间。[个人习惯]

为减少出错机会,可用若干个"using 命名空间::成员”声明来代替“using namespace 命名空间”声明,如果较多使用,可以在同文件中专门书写。

  

参考:

1. c++命名空间
  http://blog.csdn.net/randyjiawenjie/article/details/6637043

c++,命名空间(namespace)的更多相关文章

  1. PHP 命名空间(namespace)

    PHP 命名空间(namespace) PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物. 不过在PHP当中还是有着相当重要的意义 ...

  2. Atitit  深入理解命名空间namespace  java c# php js

    Atitit  深入理解命名空间namespace  java c# php js 1.1. Namespace还是package1 1.2. import同时解决了令人头疼的include1 1.3 ...

  3. PHP 使用命名空间(namespace),实现自动加载

    示例: #/DB/MySql.class.php也就是DB文件夹下有MySql.class.php文件 namespace DB; class MySql { public function __co ...

  4. PHP命名空间(Namespace)的使用详解(转)

    对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...

  5. PHP命名空间(Namespace)的使用详解

    对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...

  6. include与__autoload与命名空间namespace与PSR4详解

    1. include, require, include_once, require_once include和require是PHP中引入源文件最基本的用法,其他例如__autoload, name ...

  7. PHP深入浅出之命名空间(Namespace)的使用详解

    对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...

  8. 第十一节,命名空间namespace

    1,命名空间的定义 命名空间可以把不同的方法分散到不同的文件去实现,如果你会objective-C,他的作用和里面的类目有异曲同工之妙.当然了也有很多不同的地方,首先要明白的是,命名空间并不是一个类, ...

  9. C++笔记008:C++对C的扩展——命名空间 namespace基础

    原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 第一, 命名空间的意义 命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突. 我认识两位叫“A”的朋友,一 ...

  10. PHP的命名空间namespace

    对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...

随机推荐

  1. Aone新拉分支

    1.进入Aone新建项目 2.测试人员填huyangjun和husong 3.进入后拉分支 4.弄个日常普通环境 5.吧环境跑起,绑定Host就可以

  2. 文件上传 PHP

    参考http://www.w3school.com.cn/php/php_file_upload.asp 文件上传实际上是一个文件复制的过程  当我们选中一个文件之后  php默认的tmp文件夹中就有 ...

  3. 两种解决Qt5显示中文乱码的方法(使用QStringLiteral和#pragma execution_character_set("utf-8")两种方法)

    升级到Qt5.X之后,原先解决的Qt显示中文乱码的方法突然不适用了,找了很多方式来解决这个问题第一种:在公司代码里看到的方法,先将对应的cpp文件用windows自带的记事本打开,另存为UTF-8格式 ...

  4. php 登录实例演示

    <pre name="code" class="python">一.模板的使用 (重点) a.规则 模板文件夹下[TPL]/[分组文件夹/][模板主 ...

  5. java.lang.class.getResource

    静态块,在项目启动的时候就执行,是主动执行的. 静态方法,  是被动执行的,需要被调用才执行. static{         try {             String path = Conf ...

  6. flex正则表达式

    正则表达式是一种通用的标准,大部分计算机语言都支持正则表达式,包括as3,这里收集了一些常用的正则表达式语句,大家用到的时候就不用自己写了 ^\d+$ //匹配非负整数(正整数 + 0) ^[0-9] ...

  7. java实现冒泡排序,选择排序,插入排序,快速排序(简洁版)及性能测试

    1.冒泡排序是排序里面最简单的了,但性能也最差,数量小的时候还可以,数量一多,是非常慢的. 它的时间复杂度是O(n*n),空间复杂度是O(1) 代码如下,很好理解. public void bubbl ...

  8. iOS --- [持续更新中] iOS移动开发中的优质资源

    在我们做iOS APP的开发过程中, 须要非常多设计, 产品, 技术, 运营等方面的技巧和资源. 现将其整理汇总, 本文会一直持续更新. 敬请关注. 设计 Dribbble Dribbble是一个面向 ...

  9. Android 建造者(Builder)模式

    关于 Builder 模式 详述:http://blog.csdn.net/jjwwmlp456/article/details/39890699 先来张图 看到 Android  中 使用了 Bui ...

  10. 阵列中条带(stripe)、stripe unit

    摘抄:http://blog.sina.com.cn/s/blog_4a362d610100aed2.html 在磁盘阵列中,数据是以条带(stripe)的方式贯穿在磁盘阵列所有硬盘中的.这种数据的分 ...