【C++ 语言】命名空间 ( namespace | 命名空间定义 | 命名空间嵌套 | 域作用符 | 与 include 对比 )(一)

简介: 【C++ 语言】命名空间 ( namespace | 命名空间定义 | 命名空间嵌套 | 域作用符 | 与 include 对比 )(一)

命名空间简介


命名空间 ( 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!

image.png




自定义嵌套命名空间


自定义嵌套命名空间 :


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();


目录
相关文章
|
1天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
10 4
|
25天前
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
22 5
|
1月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
26 2
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
51 1
|
1月前
|
安全 程序员 编译器
【C++】如何巧妙运用C++命名空间:初学者必备指南
【C++】如何巧妙运用C++命名空间:初学者必备指南
|
30天前
|
存储 编译器 C语言
深入计算机语言之C++:类与对象(上)
深入计算机语言之C++:类与对象(上)
|
30天前
|
存储 分布式计算 编译器
深入计算机语言之C++:C到C++的过度-2
深入计算机语言之C++:C到C++的过度-2
|
30天前
|
编译器 Linux C语言
深入计算机语言之C++:C到C++的过度-1
深入计算机语言之C++:C到C++的过度-1
|
2月前
|
C++
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
|
24天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
22 4