Cross the stars over the moon to meet your better-self.
1 命名空间
在 C/C++ 中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是 对标识符的名称进行本地化 ,以 避免命名冲突或名字 污染 , namespace 关键字的出现就是针对这种问题的。
1.1 命名空间定义
定义命名空间,需要使用到 namespace 关键字 ,后面跟 命名空间的名字 ,然 后接一对 {} 即可, {} 中即为命名空间的成员。
我们可以来举一些例子:
#include<stdio.h> #include<stdlib.h> int rand = 1; int main() { printf("%d\n", rand); return 0; }
为啥这段代码会报错呢?
经过分析我们不难发现我们自己定义的rand与官方库里定义的rand函数冲突了,解决方法就是用命名空间来隔离我们所定义的变量或者函数:
namespace grm { int rand = 1; }
我们发现这样就可以编译通过了。
注意:
1 命名空间中的内容,既可以定义变量,也可以定义函数;
2 命名空间可以嵌套 ;
3 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
像下面这两种方式都是合理的:
// 命名空间可以嵌套 namespace grm { int a; int b; int Add(int left, int right) { return left + right; } namespace N3 { int c; int d; int Sub(int left, int right) { return left - right; } } }
而且最后编译器会将同一个工程中相同的命名空间合并为一个命名空间。但是值得注意的是一旦命名空间中变量定义了就不可以在命名空间中修改:
这样都会导致编译器报错的。
一个命名空间就定义了一个新的作用域 ,命名空间中的所有内容都局限于该命名空间中。这句话的意思简单点来说就是我们自己定义的命名空间就是一个隔离区,不会与库里面的变量或者函数发生冲突,那么应该如何使用命名空间呢?
1.2 命名空间使用
1.2.1 加命名空间名称及作用域限定符
什么是作用域限定符呀?
:: (两个冒号)
namespace grm { int rand = 1; int ret = 1001; int Add(int x, int y) { return x + y; } } int main() { printf("%d\n", grm::rand); printf("%d\n", grm::ret); printf("%d\n", grm::Add(10,20)); return 0; }
1.2.2 使用using将命名空间中成员引入
#include<stdio.h> //#include<stdlib.h> namespace grm { int rand = 1; int ret = 1001; int Add(int x, int y) { return x + y; } } using grm::rand; using grm::Add; int main() { printf("%d\n", rand); printf("%d\n", grm::ret); printf("%d\n", Add(10,20)); return 0; }
这个时候记得把库里面的rand给屏蔽了,不然就会冲突。
1.2.3 使用using namespace 命名空间名称引入
这种方式最为简单,但是不推荐在工程里面用,否则可能会发生命名冲突的问题,平常的代码练习可以这样做(因为代码量不会太大,一般不会冲突)
using namespace grm; int main() { printf("%d\n", rand); printf("%d\n", ret); printf("%d\n", Add(10,20)); return 0; }
2 C++输入&&输出
#include<iostream> int main() { int i; char c; double d; std::cin >> i >> c >> d; std::cout << i << " " << c << " " << d << std::endl; return 0; }
说明:
1. 使用 cout 标准输出 ( 控制台 ) 和 cin 标准输入 ( 键盘 ) 时,必须 包含 < iostream > 头文件 以及 std 标准命名空间。
注意:早期标准库将所有功能在全局域中实现,声明在 .h 后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在 std 命名空间下,为了和 C 头文件区分,也为了正确使用命名空间,规定 C++ 头文 件不带 .h ;旧编译器 (vc 6.0) 中还支持 格式,后续编译器已不支持,因此 推荐 使用 +std 的方式。
2. 使用 C++ 输入输出更方便,不需增加数据格式控制,比如:整形 --%d ,字符 --%c
3 其中<< 表示流插入符 >>表示流提取符。
4 endl表示换行。
但是上面老是用std::很麻烦,平常练习中我们为了轻松一点儿可以直接用
using namespace std 直接将库中所有的函数和变量都引出来,但是在工程中并不推荐这样做。
#include<iostream> using namespace std; int main() { int i; char c; double d; cin >> i >> c >> d; cout << i << " " << c << " " << d << endl; return 0; }
我们发现了用cin && cout居然不用管变量的类型是啥,不像C语言还得记住整形用%d 字符用%c 等等。但是万事也不是绝对,有时用scanf && printf比用cin && cout要简单些,具体情况具体分析,一般来说,哪种方便用哪个,甚至还可以组合使用。