前言:从这篇开始,博主将开始自己的C++学习,对C++感兴趣的同学,可以点赞收藏,跟小董我呢🤓一起学习哦!
一、定义命名空间
1、namespace
①定义命名空间,使用关键字namespace,后跟命名空间名字,然后接一对{}即可,{}中即为命名空间的成员,命名空间中可以定义变量/函数/类型等。
②namespace 本质是定义一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,使函数命名不冲突。
③C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。
④namespace只能定义在全局,当然他还可以嵌套定义。
项目工程中多文件中定义的同名namespace会认为是一个namespace,不会冲突。
C++标准库都放在一个叫std(standard)的命名空间中。
命名空间的嵌套
二、命名空间使用
编译查找一个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。
如下面代码所示。
#include<stdio.h>
namespace bit
{
int a = 0;
int b = 1;
}
int main()
{
// 编译报错:error C2065: “a”: 未声明的标识符
printf("%d\n", a);
return 0;
}
所以程序编译会报错。所以我们要使用命名空间中定义的变量/函数,有三种方法:
1、指定命名空间访问,在做项目时推荐这种方式。(修改上面代码)
// 指定命名空间访问
int main()
{
printf("%d\n", N::a);
return 0;
}
2、using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。
// using将命名空间中某个成员展开
using N::b;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
return 0;
}
3、展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序可以使用。
// 展开命名空间中全部成员
using namespce N;
int main()
{
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
三、C++输入&输出
1、<iostream>是Input Output Stream的缩写,是标准的输入、输出流库,定义了标准的输入输出对象。 2、 std::cin是istream类的对象,它主要面对窄字符的标准输入流。 3、std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流 4、std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。
5、<<是流插入运算符,>>是流提取运算符。(在C语言中用这两个运算符做位运算左移/右移)
6、使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动指定格式,C++的输入输出可以自动识别变量类型(本质是通过函数重载实现的),最重要的是C++的流能更好的支持自定义类型对象的输入输出。
7、cout/cin/endl等都属于C++标准库,C++标准库都放在一个叫std(standard)的命名空间里,所以要通过命名空间的使用方式去用它们,
8、在日常练习中,我们可以使用using namespace std