命名空间简介
命名空间 ( namespace ) :
1.命名空间简介 : C++ 中的命名空间相当于 Java 中的 Package 包 , 最常用的命名空间是 std , 基本每个项目都要使用 , 代码如下 :
using namespace std;
2.命名空间作用 : 平时使用的 cout , endl 等都是在 std 命名空间 中定义的 , 如果不声明 std 命名空间 , 那么命令行输出使用的 cout 和 endl 必须使用 域作用符 "::" 进行访问 ;
① 域作用符访问方法 : 命名空间 :: 变量名
② 不声明 std 命名空间使用 cout 方法 : std::cout
③ 不声明 std 命名空间使用 endl方法 : std::endl
// 命名空间 相当于 Java 中的 Package 包 , // 上面的 cout endl string 等都定义在 std 命名空间中 // 如果没有 using namespace std; 声明命名空间 , // 那么必须使用域作用符 "::" ( 两个冒号 ) , 否则全都会报错 std::cout << "没有使用命名空间 需要使用 std::cout << ... << std::endl 打印" << std::endl;
3.执行结果 :
没有使用命名空间 需要使用 std::cout << ... << std::endl 打印
自定义命名空间
自定义命名空间 ( namespace ) :
1.定义方式 : 使用 “namespace 命名空间名称 {}” 格式 , 定义命名空间 , 可以将变量和方法定义在命名空间中 ;
//自定义命名空间 namespace mynamespace { //调用时 需要调用 mynamespace::say_hi() 方法进行调用 void say_hi() { //注意 : 下面的 cout 和 endl 定义在 std 命名空间中 //如果没有声明 using namespace std; , 就必须使用域作用符号 "::" 才能访问 //域作用符格式 : 命名空间::调用内容 std::cout << "自定义命名空间 mynamespace say_hi() 方法 : Hi!" << std::endl; }
2.声明自定义的命名空间 : 使用 “using namespace 命名空间名称;” 声明命名空间 ; 下面是声明命名空间 与 不声明 的区别 :
① 声明命名空间 : 可以直接调用命名空间中的方法 ;
② 没有声明该命名空间 : 就必须使用 “命名空间名称::方法名()” 域作用符调用命名空间定义的方法 ;
//声明自定义的命名空间 , 声明 外层命名空间 , //可以直接调用 say_hi() 方法 ; //调用内层的 say_hi_inner() 方法需要使用 myinnernamespace::say_hi_inner() 进行调用 using namespace mynamespace;
3.访问命名空间中的方法 ( 没有声明的情况下 ) : 如果没有声明命名空间 , 需要调用 “命名空间名称::方法名()” 的方式调用命名空间中的方法 , 这里想要调用 mynamespace 命名空间的 say_hi() 方法 , 就需要按照下述代码进行操作 ;
//没有声明命名空间 : 调用自定义的 mynamespace 命名空间中的 say_hi 方法 , 必须使用域作用符 mynamespace::say_hi();
4.访问命名空间中的方法 ( 已经声明的情况下 ) : 如果已经声明了命名空间 , 就可以直接调用命名空间中的方法 , 不需要使用 域作用符 访问命名空间中的方法 ;
//声明命名空间 : 如果声明了 外层的命名空间 , 可以调用外层命名空间中定义的 say_hi() 方法 say_hi();
5.命名空间相关的代码 : 包括 ① 命名空间定义 , ② 声明 , ③ 使用 ( a. 声明命名空间 / b. 未声明命名空间 ) 的代码 ;
//1.命名空间定义 : 自定义命名空间 namespace mynamespace { //调用时 需要调用 mynamespace::say_hi() 方法进行调用 void say_hi() { //注意 : 下面的 cout 和 endl 定义在 std 命名空间中 //如果没有声明 using namespace std; , 就必须使用域作用符号 "::" 才能访问 //域作用符格式 : 命名空间::调用内容 std::cout << "自定义命名空间 mynamespace say_hi() 方法 : Hi!" << std::endl; } } //2. 命名空间声明 //声明自定义的命名空间 , 声明 外层命名空间 , //可以直接调用 say_hi() 方法 ; //调用内层的 say_hi_inner() 方法需要使用 myinnernamespace::say_hi_inner() 进行调用 using namespace mynamespace; //下面是方法中的代码 //3. 没有声明命名空间的情况下调用命名空间中的方法 //没有声明命名空间 : 调用自定义的 mynamespace 命名空间中的 say_hi 方法 , 必须使用域作用符 mynamespace::say_hi(); //4. 已经声明命名空间的情况下调用命名空间中的方法 //声明命名空间 : 如果声明了 外层的命名空间 , 可以调用外层命名空间中定义的 say_hi() 方法 say_hi();
6.代码执行结果 :
自定义命名空间 mynamespace say_hi() 方法 : Hi! 自定义命名空间 mynamespace say_hi() 方法 : Hi!
自定义嵌套命名空间
自定义嵌套命名空间 :
1.嵌套命名空间简介 : 命名空间内部再定义一个命名空间 , 这种情况就是嵌套的命名空间 ; 如下代码 , myinnernamespace 就是定义的内层的命名空间 , 如果要访问内层命名空间的方法 , 需要两个域作用符才能访问 ;
//命名空间定义 : 自定义命名空间 namespace mynamespace { //调用时 需要调用 mynamespace::say_hi() 方法进行调用 void say_hi() { //注意 : 下面的 cout 和 endl 定义在 std 命名空间中 //如果没有声明 using namespace std; , 就必须使用域作用符号 "::" 才能访问 //域作用符格式 : 命名空间::调用内容 std::cout << "自定义命名空间 mynamespace say_hi() 方法 : Hi!" << std::endl; } //嵌套的命名空间需要调用 mynamespace::myinnernamespace::say_hi() 才能调用该方法 namespace myinnernamespace { void say_hi_inner() { //注意 : 下面的 cout 和 endl 定义在 std 命名空间中 //如果没有声明 using namespace std; , 就必须使用域作用符号 "::" 才能访问 //域作用符格式 : 命名空间::调用内容 std::cout << "自定义嵌套的命名空间 myinnernamespace say_hi_inner() 方法 : Hi Inner!" << std::endl; } } }
2.声明外层命名空间 : 需要使用 “using 外层命名空间名称;” 方式进行声明 ;
//声明自定义的命名空间 , 声明 外层命名空间 , //可以直接调用 say_hi() 方法 ; //调用内层的 say_hi_inner() 方法需要使用 myinnernamespace::say_hi_inner() 进行调用 using namespace mynamespace;
3.声明内层命名空间 : 需要使用 “using 外层命名空间名称::内层命名空间名称;” 方式进行声明 ;
//声明内层的命名空间 , 需要使用 外层命名空间::内层命名空间 进行声明 //这样就可以直接调用内层命名空间的 say_hi_inner() 方法了 using namespace mynamespace::myinnernamespace;
4.嵌套命名空间访问 : 需要使用两个域作用符进行访问 , 格式是 “外层命名空间::内层命名空间::内层命名空间定义的方法或变量名称” ;
//没有声明命名空间 : 嵌套的命名空间调用 , 需要使用两个域作用符访问最内层命名空间中定义的方法 mynamespace::myinnernamespace::say_hi_inner();
5.不声明命名空间的访问方式 : 此时就需要完整的使用两个域作用符访问内层命名空间中的方法或变量 , 代码如上面的代码
//没有声明命名空间 : 嵌套的命名空间调用 , 需要使用两个域作用符访问最内层命名空间中定义的方法 mynamespace::myinnernamespace::say_hi_inner();
6.声明外层命名空间的访问方式 : 此时可以不使用外层的命名空间名称 , 直接使用 “内层命名空间名称::方法名()” 访问内层命名空间中定义的方法 ;
① 省略外层命名空间 : 只声明了外层命名空间 , 这里就可以省略上面的外层命名空间 ;
② 不能省略内层命名空间 : 内层的命名空间不能省略 , 因为没有声明内部命名空间 ;
③ 域作用符个数 : 需要一个域作用符访问内层命名空间中的方法 ;
//只声明了外层命名空间 , 这里就可以省略上面的外层命名空间 , //但是内层的命名空间不能省略 , 因为没有声明内部命名空间, //需要一个域作用符访问内层命名空间中的方法 myinnernamespace::say_hi_inner();