C++初阶命名空间

目录

    • 命名空间
      • 命名空间定义
      • 命名空间的使用
      • 输入和输出

命名空间

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的.

#include
#include

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

// 这一行是干什么的?为什么要有这一行
// 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’

  1. cout标准输出对象和cin标准输入对象要包含< iostream >头文件以及按命名空间使用方法使用std。
  2. <<是流插入运算符,>>是流提取运算符
  3. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式%d什么的。C++的输入输出可以自动识别变量类型。想控制浮点数的位数,用C语言就可以了,用C++控制会麻烦。

你可能感兴趣的:(C++初阶,c++)