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) 编辑 收藏 举报