zoukankan      html  css  js  c++  java
  • 第一章 01 namespace 命名空间

    一、什么是namespace?

    namesapce是为了防止名字冲突提供的一种控制方式。

    当一个程序需要用到很多的库文件的时候,名字冲突有时无法避免。之前的解决思路是使用更长的变量名字,使用不方便。

    二、命名空间的定义

    1、namespace   空间名称 {

    变量;

    函数;

    类;

    }

    三、命名空间的特点

    1、每个命名空间都有自己的作用域;

    2、命名空间可以是不连续的,正像代码中的所列举的例子;

    1.1 如何理解命名空间的作用域

     1 namespace global_namespace{
     2 
     3 
     4              namespace local_namespace_1{
     5 
     6               int i;
     7               int j;
     8              }
     9 
    10 
    11              namespace local_namespace_2{
    12 
    13               int i;
    14               int j;
    15              }   
    16 
    17 
    18 
    19 }

    LINE6~7和LINE13~14均定义相同的变量,但是不会冲突;

    因为引用的时候分别为

    global_namespace::local_namespace_1::i=10;
    global_namespace::local_namespace_2::i=10; 

    在使用的时候,需要明确的指出变量所在的空间,因为不会冲突啦!不过这种写法,看着就有崩溃的赶脚。

    幸好,在同一个命名空间内的应用是不需要这样啰嗦的

    1 namespace    local_namesapce_3{
    2                              int i=10;
    3                              int j=10;
    4 
    5 
    6                              int sum = i+j; //这里是不需要写出变量所在的命名空间的
    7 
    8 
    9 }

     1.2  命名空间可以是不连续的,改如何理解呢?

    当我们定义了一个命名空间的时候,可能有两种情况:

    1)之前从来没有定义过,这里是第一次定义命名空间;

    2)之前已经定义过,这里则意味着为原来的命名空间增加一些新的成员

    这里以第二种情况举例:

    在aa.hh头文件中定义了命名空间

    namespace  namespace_test{
    
    int i;
    int j;
    
    
    }

    接着我们在bb.hh头文件中也定义一个具有相同名字的命名空间

    namespace  namespace_test{
    
    int i;
    int j;
    
    
    }

    编译看看会出现什么惊喜呢。。。。

     error: redefinition of `int namespace_test::i'

    error: `int namespace_test::i' previously declared here

     编译结果,可以表明,虽然命名空间分别定义在不同的文件中,空间上是离散的,但是编译器仍然认为两者是在同一个命名空间,所以会给出变量重复定义的错误!

    OK,关于namespace的特性分析就暂时到这里,以后遇到会继续深入补充。。。。。

    四、命名空间的类型

    1、全局命名空间(global namespace)

    2、内联命名空间(inline namesapce)

    3、未命名的命名空间(unnamed namespace)

    $$4.1理解什么是全局命名空间

    书中说,全局命名空间是以隐式的方式声明,什么是隐式呢?也就是说,即使你什么也不做,你的代码中会一直漂浮着这么一张全局的网,你所定义、声明的变量、函数和类均在它的笼罩之下。当然对于这种看不见的网,也不是一点也摸不着的。对其内部的变量是可以通过下述的方式引用的:

    ::members  因为这个隐式的全局命名空间没有名字,所以就只能以无名英雄来称呼他了。

    /***************************************************************************************************************/

    $$4.2 理解什么是内联命名空间

    定义:

    inline  namespace  空间名称{

    }

    这个是C++11的新特性了

    /***************************************************************************************************************/

    $$4.3 理解什么是未命名空间

     未命名空间仅仅在特定的文件内有效,不同文件的未命名空间不关联。此外,未命名空间声明的变量和语句,其声明周期一直延续到程序的结束,拥有静态生命周期。

    在C语言中,我们一般用static关键词来定义全悲剧变量和函数,以保证其仅仅在当前文件内被访问。同样的道理,我们这里可以采用未命名空间来实现这一目的。

    C++中已经取消了使用static的方法。

  • 相关阅读:
    Windows Server 2012 两台服务器文件同步
    Linux下非root用户运行Tomcat
    Linux离线安装mysql 5.6详细步骤
    spring再学习之整合JDBC
    spring再学习之AOP实操
    spring再学习之AOP准备
    spring再学习之注解
    spring再学习之配置详解
    spring再学习之基本概念
    spring再学习之简单测试
  • 原文地址:https://www.cnblogs.com/lopnor/p/4135870.html
Copyright © 2011-2022 走看看