c++,命名空间(namespace)

1.什么是命名空间:

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

2.命名空间的作用:

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

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

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

#include <iostream>
using namespace std;
// 在声明一个命名空间时,花括号内不仅可以包括变量,而且还可以包括以下类型:
//     ·变量(可以带有初始化);
//     ·常量;
//     ·数(可以是定义或声明);
//     ·结构体;
//     ·类;
//     ·模板;
//     ·命名空间(在一个命名空间中又定义一个命名空间,即嵌套的命名空间)。
//     例如
namespace NS
{
    const double RATE=0.08; //常量
    double pay = 200;       //变量
    double tax()            //函数
    {
        return pay * RATE;
    }
    namespace InterNS       //嵌套的命名空间
    {
        int age = 29;
    }
}

//如果想输出命名空间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(1);
    return 0;
}
//
// 0.08
// 200
// 16
// 29

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(10086,"xiaobao",18); //
    stud1.get_data();
    cout <<"n1::fun(a8,4) = "<< ns1 :: fun(8,4) << endl;

    ns2 :: Student stud2(10087,"xiaobei",‘m‘);
    stud2.get_data();
    cout <<"n2::fun(a8,4) = "<< ns2:: fun(8,4) << endl;

    while(1);
    return 0;
}

// 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(1);
        return 0 ;
}
//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(1);
        return 0 ;
}
//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(10086,"xiaobao",18); // error C2872: “Student”: 不明确的符号
    stud1.get_data();
    cout <<"n1::fun(a8,4) = "<< ns1 :: fun(8,4) << endl;

    Student stud2(10087,"xiaobei",‘m‘);// error C2872: “Student”: 不明确的符号
    stud2.get_data();
    cout <<"n2::fun(a8,4) = "<< ns2:: fun(8,4) << endl;

    while(1);
    return 0;
}

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(1);
    return 0;
}

  下面这样是错误的:

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

时间: 2024-10-18 23:45:27

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

PHP中的命名空间(namespace)及其使用详解

PHP中的命名空间(namespace)及其使用详解 晶晶 2年前 (2014-01-02) 8495次浏览 PHP php自5.3.0开始,引入了一个namespace关键字以及__NAMESPACE__魔术常量(当然use关键字或use as嵌套语句也同时引入):那么什么是命名空间呢?php官网已很明确的进行了定义并形象化解释,这里直接从php官网copy一段文字[来源]. “什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录

Atitit &#160;深入理解命名空间namespace &#160;java c# php js

Atitit  深入理解命名空间namespace  java c# php js 1.1. Namespace还是package1 1.2. import同时解决了令人头疼的include1 1.3. 在不支持ns的语言里面使用ns,前缀发1 1.4. 常用命名空间的统计(约150个)1 1.5. 命名空间2 1.5.1. 在struts2中2 1.6. Linux 就支持6种不同类型的命名空间.2 1.1. Namespace还是package 1.2. import同时解决了令人头疼的in

命名空间 namespace

;命名空间 namespace 假如很多人使用你写的类可以用namespace包起来,有文件中定义命名空间 cpp中使用命名空间 using namespace ..;这样函数或者变量自动加作用域了 iostream在.h 写的命名空间把一些函数变量都包起来了,然后引进来使用using namespcase使用命名空间

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

对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀. 例:项目中有两个模块:article和message board,它们各自有一个处理用户留言的类Comment.之后我可能想要增加对所有用户留言的一些信息统计功能,比如说我想得到所有留言的数量.这时候调用它们Comment提供的方法是很好的

PHP命名空间namespace使用小结

1.介绍一下php的命名空间 什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色.具体举个例子,文件 foo.txt 可以同时在目录/Home/greg 和 /Home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件.另外,在目录 /Home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /Hom

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

示例: #/DB/MySql.class.php也就是DB文件夹下有MySql.class.php文件 namespace DB; class MySql { public function __construct() { var_dump(__FILE__); } } #/index.php namespace Home; use DB\MySql; $mysql = new MySql(); 报错 Fatal error: Class 'DB\MySql' not found in D:\l

struts2 命名空间 namespace 学习

默认的命名空间" namespace="" ", 根命名空间 " namespace="/" ". <package name="test" extends="struts-default"> ,如果未指定命名空间,则命名空间默认为 " namespace="" ". 默认命名空间里的Action可以处理任何命名空间下的Action请求

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

对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀. 例:项目中有两个模块:article和message board,它们各自有一个处理用户留言的类Comment.之后我可能想要增加对所有用户留言的一些信息统计功能,比如说我想得到所有留言的数量.这时候调用它们Comment提供的方法是很好的

php命名空间(namespace)内如何使用系统类

作者:ffsystem 使用命名空间,可以更方便的组织代码,以及代码复用.新写的一个项目引入了命名空间. 简介:使用namespace,使用__autoload自动导入类. 今天将以前的一段代码,加入到新项目时,出现了奇怪的问题: 代码中有一行: $this->db=new mysqli(***); 错误提示: Warning: require(FFSystem/mysqli.php): failed to open stream: No such file or directory in **

PHP 命名空间(namespace)

1 命名空间综述 在C#和Java中都有命名空间的概念,而在PHP中,命名空间在PHP 5.3版本中首次加入的,以前的版本没有这个功能. 1.1 为什么要使用命名空间? 做项目时,一个文件可能会引入多个文件.如果不使用命名空间,引入的多个文件中可能存在同名的类.函数.常量,就会报错(重复定义的错误). 以函数为例,演示如下: 1.1.1 不使用命名空间: 运行结果: 1.1.2 使用命名空间: 只在上述代码中修改b.php文件,如下: 再次访问,则不会报错,运行结果: 1.2 使用命名空间 优势