namespace关键字学习笔记

一、namespace简介

namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的namespace,但是由于现在的程序的规模越来越大,程序的分工越来越细,全局作用域变得越来越拥挤,每个人都可能使用相同的名字来实现不同的库,于是程序员在合并程序的时候就会可能出现名字的冲突。namespace允许像类,对象,函数聚集在一个名字下。本质上讲namespace是对全局作用域的细分。

二、namespace总结

1.namespace的格式基本格式

namespace identifier {
    entities;
}
eg:
namespace exp {
    int a,b;
}

2.在namespace外使用namespace内的变量需使用‘::’作用域描述符,eg:
exp::a
exp::b

3.使用namespace有效的避免重全局变量重定义

4.using关键字可以帮助从namespace中引入全局变量到当前的声明区域

eg:
#include <iostream>
using namespace std;

namespace first {
    int x = 5;
    int y = 10;
}

namespace second {
    double x = 3.1416;
    double y = 2.7183;
}

int main () {
    using first::x;
    using second::y;
    cout << x << endl;
    cout << y << endl;
    cout << first::y << endl;
    cout << second::x << endl;
    return 0;
}
输出是
5
2.7183
10
3.1416
就如我们所指定的第一个x是first::x,y是second.y

5.using关键字也可以导入整个的namespace

eg:
#include <iostream>
using namespace std;

namespace first {
    int x = 5;
    int y = 10;
}

namespace second {
    double x = 3.1416;
    double y = 2.7183;
}

int main () {
    using namespace first;
    cout << x << endl;
    cout << y << endl;
    cout << second::x << endl;
    cout << second::y << endl;
    return 0;
}
输出是
5
10
3.1416
2.7183

6.namespace的显示限定
在头文件中,我们通常坚持使用显式的限定,并且仅将using指令局限在很小的作用域中,这样他们的效用就会受到限制并且易于使用。

eg:
#include <iostream>
using namespace std;

namespace first {
  int x = 5;
}

namespace second {
  double x = 3.1416;
}

int main () {
    {
        using namespace first;
        cout << x << endl;
    }
    {
        using namespace second;
        cout << x << endl;
    }
    return 0;
}
输出是
5
3.1416

7.namespace支持嵌套
在namespace first中嵌套了namespace second,seond并不能直接使用,需要first来间接的使用。

eg:
#include <iostream>
namespace first {
    int a=10;
    int b=20;

    namespace second {   
        double a=1.02;
        double b=5.002;
        void hello();
    }   

    void second::hello() {   
        std::cout <<"hello world"<<std::endl;
    }
}

int main() {
    using namespace first;
    std::cout<<second::a<<std::endl;
    second::hello();
}
输出是
1.02
hello world

8.namespace可以使用别名

在对一些名字比较长的namespace使用别名的话,是一件很惬意的事。但是与using相同,最好避免在头文件使用namespace的别名(t比telephone更容易产生冲突)。
namespace t = telephone;

9.namespace提供了单独的作用域
它类似于静态全局声明的使用,可以使用未命名的namespace定义来实现

#include <iostream>

namespace {
    int count = 0;
}

void chg_cnt (int i) { 
    count = i; 
} 

int main () {

    count = 10;
    std::cout<<count<<std::endl; //没有指定using namespace std,而cout是std中定义的,因此要加上::
    return 0;
}

10. 一个例子: 一个源文件中有两个main()

#include <iostream>

using namespace std;

namespace android {
    int main(void)
    {
        cout << "android::main()" << endl;
        return 0;
    }

}

int main(void)
{

    cout << "std::main()" << endl;

    android::main();
    
    return 0;
}

 

二、补充

1. 命名空间A引用命名空间B的例子

~/tmp/3.cpp_test/4.namespace$ tree
.
├── func.cpp
├── func.h
└── test.cpp

/* -------- func.h 文件 -------- */
/* 注意,头文件中往外导出函数也要加上 namespace 声明 */
namespace A {
    void hello_a(void);
}

/* -------- func.cpp 文件 -------- */
#include <stdio.h>

namespace A {
        void hello_a(void) {
                printf("Hello world!\n");
        }
}

/* -------- test.cpp 文件 -------- */
#include <iostream>
#include <fstream>
#include "func.h" //必须要有

using namespace std;

//using A::hello_a; //test-1: 成功
//using namespace A; //test-2: 成功

namespace B {
    using A::hello_a; //test-3: 成功
    void hello_b(void) {
        printf("NiHao!\n");
        hello_a();
    }
}; //分号可有可无

using B::hello_b;

int main()
{
    hello_b();
    return 0;
}

/*
~/tmp/3.cpp_test/4.namespace$ g++ func.cpp test.cpp -o pp
~/tmp/3.cpp_test/4.namespace$ ./pp
NiHao!
Hello world!
*/

小结:可以在多个位置加 using,而且A前面::可有可无。命名空间大括号后面的分号可有可无。

测试2:

/* -------- test.cpp 文件 -------- */
#include <iostream>
#include <fstream>
#include "func.h" //必须要有

using namespace std;

namespace A {
    namespace C {
        void hello_c(void) {
            hello_a(); //test-4: 子命名空间可以直接使用父命名空间中的函数
        }
    };
};

using A::C::hello_c;

int main()
{
    hello_c();
    return 0;
}

小结:子命名空间中可以直接使用父命名空间中的函数,而不需要使用using关键字声明。

 

posted on 2019-02-20 12:13  Hello-World3  阅读(343)  评论(0编辑  收藏  举报

导航