本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下:
- 基础篇:类与对象(涉及C++的三大特性等);
- STL 篇:学习使用 C++ 提供的 STL 相关库;
- 高阶数据结构与算法篇: 手动实现自己的 STL 库 及 设计实现高阶数据结构,如 B树、B+树、红黑树等。
本期内容:C++ 命名空间的作用 / 意义、声明、使用(建议)与解读
目录:
1. 命名空间的作用 / 意义
2. 命名空间的声明
- - 2.1 声明的语法格式
- - 2.2 命名空间中的成员类型
3. 命名空间的使用(建议)与解读【重点】
- - 3.1 命名空间中成员的访问方式
- - 3.2 using namespace xxx 的意义
- - 3.3 实际项目中的使用建议
【 合集链接 】
1. 命名空间的作用 / 意义
代码示例
#include<iostream>
using namespace std; // 此时即是使用命名空间
int main(){
return 0;
}
在 C/C++ 中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突(命名)。
使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
2. 命名空间的声明
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中!
2.1 声明的语法格式
基本格式:命名空间关键字 + 空间名 + {};
代码示例
/* 命名空间关键字 + 空间名 + {}; */
/* 即:namespace mystd {}; */
/* {} 中可以自定义成员 */
/* 示例 */
namespace mystd{ // mystd 是自定义空间名! 注:一般开发中是用项目名字做命名空间名。
int rand;
double age;
};
2.2 命名空间中的成员类型
- {} 中可以自定义成员
成员可包含:
1. 各种基本数据类型:int、float、double …
2. 其他“符合”类型:结构体、联合 …
3. 函数
4. 命名空间(即:可嵌套)
代码示例
/* {} 中可以自定义成员 */
/*
成员可包含:
1. 各种基本数据类型:int、float、double ...
2. 其他“符合”类型:结构体、联合 ...
3. 函数
4. 命名空间(即:可嵌套)
*/
/* 示例 */
namespace mystd{
// 各种基本数据类型
int rand;
double age;
// 其他“符合”类型:结构体
struct Node{
struct Node* next;
int data;
};
// 函数
int max(int a, int b){
return a>b?a:b;
}
// 命名空间(即:可嵌套)
namespace child_mystd{
int age;
};
};
3. 命名空间的使用(建议)与解读
3.1 命名空间中成员的访问方式
1. 格式:空间名::成员名
2. 嵌套式格式:一级空间名::二级空间名:: … ::成员名
代码示例
/* 示例 */
#include<iostream>
/* 示例 */
namespace mystd {
int age = 10; // 可以在空间中初始化变量
namespace child_mystd {
int age;
};
};
int main() {
// 变量的初始化
mystd::child_mystd::age = 20;
std::cout << mystd::age << std::endl; // 输出:10
std::cout << mystd::child_mystd::age << std::endl; // 输出:20
return 0;
}
3.2 using namespace xxx 的意义
直白解读:
- 如上程序中,我们已知 C/C++ 中的标准库都放置在 std 这个命名空间中,其中即包含了 C++ 标准输入输出:cin 和 cout;
- 若没有 using namespace std; ,你可以假想 cin 和 cout 就是局部对象,外界无权直接访问及使用!【即访问时必须使用 “命名空间::成员名” 的方式访问】
- 若有 using namespace std; 就相当于将原来 std 命名空间中的东西公开化,全局可直接访问!【即访问时无需使用 “命名空间::成员名” 的方式访问】
代码示例
/* 如下两个程序: */
/* 程序一 */
#include<iostream>
int main(){
std::cout << "hello world" << std::endl;
std::cout << "hello world" << std::endl;
std::cout << "hello world" << std::endl;
std::cout << "hello world" << std::endl;
std::cout << "hello world" << std::endl;
return 0;
}
/* 程序二 */
#include<iostream>
using namespace std;
int main(){
cout << "hello world" << endl;
cout << "hello world" << endl;
cout << "hello world" << endl;
cout << "hello world" << endl;
return 0;
}
3.3 实际项目中的使用建议
如上程序
- 固然使用 using namespace xxx,可以使我们不用繁琐的以 “命名空间::成员名” 的方式访问成员;
- 但是,接踵而来的问题是:若你不知道命名空间中的成员有哪些,同样可能导致命名冲突【如上图中的 rand】
使用建议
- 在我们日常练习中,可以使用:using namespace xxx 的方式;
- 在项目中,尽量不要使用:using namespace xxx;
若出现某些成员高频率使用时,可以使用如下指定命名空间访问!
如:高频率使用 C++ 的标准输入输出:可用如下形式声明:
using std::cin;
using std::cout;
【 即:格式:using 命名空间名::指定成员 】