命名空间
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的.
#include<stdio.h>
#include<stdlib.h>
namespace dz
{
int rand = 0;
}
int main()
{
printf("hello world\n");
printf("%p\n", rand);
// 作用域限定符::
printf("%p\n", dz::rand);
return 0;
}
命名空间定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
1.命名空间中可以定义变量/函数/类型
2.命名空间可以嵌套
3.c++中有很多库,库在很多文件里,每个文件都要定义std这个命名空间,多个相同命名空间会自动合并,不存在冲突
namespace dz
{
// 命名空间中可以定义变量/函数/类型
int rand = 10;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
namespace xxx
{
int rand = 1;
}
}
int Add(int left, int right)
{
return (left + right) * 10;
}
int main()
{
printf("%d\n", dz::rand);
printf("%d\n", dz::xxx::rand);
printf("%d\n", dz::Add(1,2));
printf("%d\n", Add(1, 2));
struct dz::Node node;
return 0;
}
命名空间的使用
- 加命名空间名称及作用域限定符
// 作用域限定符::
printf("%d\n", dz::rand);
- 全部展开命名空间
// 全部展开(授权) 存在冲突可能性大,大型项目中尽量不要使用
using namespace dz;
- 部分展开命名空间
// 部分展开(授权) 如果部分展开也冲突,那就不要展开
using dz::Add;
使用惯例:
在日常练习中,建议直接using namespace std即可,这样方便。
using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。
输入和输出
#include<iostream>
// 这一行是干什么的?为什么要有这一行
// std是C++标准库的命名空间
//using namespace std;
using std::cout;
using std::endl;
< iostream> 头文件中定义是封装到一个叫std的命名空间里的
头文件的展开是把头文件的内容拷贝,命名空间的展开可以理解为命名空间的授权。
注意:
早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h
< iostream.h>只在老的编译器才会支持,就不要使用了。
int main()
{
// << 流插入运算符
cout << "hello world" << endl;
cout << "hello world" << '\n';
cout << "hello world" << endl;
// 流提取
int i = 0;
std::cin >> i;
return 0;
}
int main()
{
int i;
double j;
std::cin >> i >> j;
cout << i << endl;
cout << j << endl;
printf("%.1f\n", j);
cout << &i << endl;
cout << &j << endl;
return 0;
}
cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出
输出打印需要换行,流提取就不需要换行也就不需要endl,endl相当于’\n’
- cout标准输出对象和cin标准输入对象要包含< iostream >头文件以及按命名空间使用方法使用std。
- <<是流插入运算符,>>是流提取运算符
- 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式%d什么的。C++的输入输出可以自动识别变量类型。想控制浮点数的位数,用C语言就可以了,用C++控制会麻烦。