zoukankan      html  css  js  c++  java
  • c++ 命名空间

    1. 全局命名空间污染问题

    1.1 原因之一:引入的库与库之间的实体名字冲突

    我们在编写大型程序时,可能会同时引入多方的库。假如我们同时引入A、B、C 三个库。 为了引入这三个库,我们需要使用其定义的类、变量、函数等。 因此会引入他们的头文件。 假如A库的头文件的名字的命名和B库头文件名字的名字是一样的。而对于主函数来说,它要同时引入这两个库,那么编译器就会报错,因为它认为一个实体定义了两次。

    1.2 原因之二:引入库 与 全局实体名字冲突

    也有可能你只引入了A库,你自己在全局命名空间也定义了一些函数、变量等,这些实体的名字 可能和你引入的库的头文件中定义的函数、类名等 是一样的,这也会发生命名的冲突。

    上述产生的命名冲突的问题,就是所谓的全局命名空间污染问题。

    2. 如何解决命名冲突问题?

    在这里插入图片描述
    实际上就是一个由程序设计者命名的内存区域,程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来。例如,从原本的命名空间中拿出来一块,取名叫std,那么std 里面的名字就可以和std以外的名字一样,但是使用的时候通过加上前缀,可以使得编译器能够标识出来这两个名字是不同的。

    3. 使用命名空间

    3.1 命名空间的定义

    定义命名空间,实际上就是拿出来一块空间,给它起个名字。

    namespace mylib
    {
    	class Myclass{};
    	int myfunction(void);
    	int myVal;
    	...
    }
    

    在其中声明的实体称为命名空间成员(namespace member)。现在命名空间成员包括类Myclass ,函数myFuntion,变量 myVal。 需要注意的是,这其中的函数是全局函数,变量是全局变量。只是 将他们隐藏在指定的命名空间mylib中而已。也就是访问这个全局变量或者全局函数,需要指定是这个命名空间下的 函数、变量。

    mylib::myVal = 3;
    mylib::myfuntion();
    

    3.2 命名空间的作用:

    是建立一些互相分隔的作用域,把一些全局实体分隔开来。以免产生老点名叫李相国时,3个人都站起来应答,这就是名字冲突,因为他们无法辨别老师想叫的是哪一个李相国,同名者无法互相区分。为了避免同名混淆,学校把3个同名的学生分在3个班。这样,在小班点名叫李相国时,只会有一个人应答。也就是说,在该班的范围(即班作用域)内名字是惟一的。如果在全校集合时校长点名,需要在全校范围内找这个学生,就需要考虑作用域问题。如果校长叫李相国,全校学生中又会有3人一齐喊“到”,因为在同一作用域中存在3个同名学生。为了在全校范围内区分这3名学生,校长必须在名字前加上班号,如高三甲班的李相国,或高三乙班的李相国,即加上班名限定。这样就不致产生混淆。

    过去我们用的全局变量可以理解为全局命名空间,独立于所有有名的命名空间之外,它是不需要用 namespace声明的,实际上是由系统隐式声明的,存在于每个程序之中。

    3.3 命名空间的成员

    在声明一个命名空间时,花括号内不仅可以包括变量,而且还可以包括以下类型:

    • 变量(可以带有初始化);
    • 常量;
    • 数(可以是定义或声明);
    • 结构体;
    • 类;
    • 模板;
    • 命名空间(在一个命名空间中又定义一个命名空间,即嵌套的命名空间)。

    例如:

    namespace nsl
    { 
      const int RATE=0.08//常量
      double pay;       //变量
      double tax()       //函数
        {
        return a*RATE;
      }
      namespacens2       //嵌套的命名空间
      {
        int age;
      }
    }
    

    4.定义类时 使用命名空间

    一般定义一个类,需要两个文件:

    • 头文件: 放类的声明部分。
    • 源文件:放类的接口的实现部分

    而由于命名空间可以是不连续的,那么我们可以这样做:

    文件1:头文件

    namespace mySpace{
    	class Myclass
    	{
    		Myclass();
    		void function1(void);
    		void function2(void);
    	}
    }
    

    文件2:源文件

    namespace mySpace{
    	Myclass::Myclass()
    	{
    		...
    	}
    	void Myclass::function1(void)
    	{
    		...
    	}
    	void Myclass::function2(void)
    	{
    		...
    	}
    }
    

    文件3: 主函数

    using namespace mySpace;
    int y;
    int mian()
    {
    	Myclass x;
    	x.function1();
    	x.function2();
    	::y = 100;
    }
    

    5. 全局命名空间

    在全局作用域中定义的名字,也就是定义在全局命名空间中。这样的名字在整个程序中都存在。全局作用域中定义的名字被隐式的添加到全局命名空间中。

    全局命名空间的成员的表示方法:

    ::member
    
  • 相关阅读:
    jquery怎么实现跨域的访问呢?与别人提供的接口连接
    服务器返回数组,data[0]得到的总是不对?如何处理?
    ajax 如何实现页面跳转
    问答精华-IntelliJ IDEA快捷键大全
    setinterval在jQuery里面是怎么使用的。
    background 、backgroundcolor、background-color 我怎么有点分不清了??
    视频最后用使用了function(i,ot)一笔带过,但我看不懂i和ot这2个参数的具体值是怎么获取得到的,能不能说一下参数传递过程?
    3张大图片自动播放
    图片自动加载
    用jQuery之后,之前javascript的一些方法就不能用了吗
  • 原文地址:https://www.cnblogs.com/lasnitch/p/12764103.html
Copyright © 2011-2022 走看看