> 文章列表 > 【初识C++】(关键字,命名空间)

【初识C++】(关键字,命名空间)

【初识C++】(关键字,命名空间)

文章目录

  • 一、C++中的关键字
  • 二、命名空间
    • 1.命名空间规则
      • 展开命名空间域 和 #include 的区别
    • 2.正确使用命名空间
  • 三、C++中的输入和输出

一、C++中的关键字

【初识C++】(关键字,命名空间)

二、命名空间

命名空间是对于全局变量来说,我们在定义变量或函数时,函数名可能会和库中的函数名产生冲突。
比如:
【初识C++】(关键字,命名空间)
报错的意思是:库中存在rand这个函数,而我又定义一个rand这个变量,所以会产生名字的冲突。

为了解决这个问题,C++引入了命名空间这个概念。

而与该命名空间的关键字是:namespace

1.命名空间规则

命名空间搜索规则:局部域->全局域->命名空间域(如果不指定,不会主动去搜索)

首先引入域的概念,学习c语言会知道,有一个域叫做作用域,比如局部作用域和全局作用域。
来看下面的代码:

int a = 10;int main()
{int a = 0;return 0;
}

我分别要输出局部作用域的a和全局作用域的a该如何输出?

使用域作用限定符

域作用限定符是: “域名+::” ,两个冒号。
比如这样:

int a = 10;int main()
{int a = 0;printf("%d\\n", a);printf("%d\\n", ::a);return 0;
}

对于全局作用域来说,想要获取a,直接在a前面加上两个冒号即可,全局域的域名可以省略。

访问命名空间域的方法:
1.展开命名空间域

看下面的代码:

namespace dzt
{int a = 5;
}//int a = 10;int main()
{//int a = 0;printf("%d\\n", a);return 0;
}

这样的代码,假如要输出a,是不行的,编译器报的错误是:
”未声明的标识符“
【初识C++】(关键字,命名空间)
所以我们想要获得命名空间域的内容,

using namespace dzt;

我们把这句代码加入到命名空间dzt下面就可以执行了。
这句代码的意思是:展开我的命名空间域dzt。【初识C++】(关键字,命名空间)
此时编译不会出现问题。

展开命名空间域 和 #include 的区别

在编译过程中:

展开命名空间域是编译器会去命名空间域搜索。

#include 是将包含的头文件的内容拷贝过来。

二者不同,注意区分。

方法2:指定命名空间对象

//命名空间后面跟名字,这个名字是随便起的。
namespace dzt
{int a = 5;
}//int a = 10;int main()
{//int a = 0;printf("%d\\n", dzt::a);return 0;
}

只需要使用 “域名::指定变量或函数” 这样的访问方式即可。

注意:对于命名空间域来说,展开了命名空间域后,相当于变成全局作用域了
比如:

int a = 10;namespace dzt
{int a = 5;
}using namespace dzt;int main()
{printf("%d\\n", a);return 0;
}

有一个全局变量a = 10,现在展开了命名空间域后,相当于全局域有a = 10 和a = 5,此时就会报a不明确的问题。

因为编译器不清楚这个a 到低是全局作用域的a还是命名空间域的a。

可以理解成,命名空间域就像是一堵围墙,一旦展开,相当于把围墙拆掉,围墙内的所有东西便会暴露出来。

总结:不要轻易展开命名空间域。

还有一个需要注意的点:

在不同的文件中创建相同名字的命名空间域,会自动将这些名字相同的命名空间域合并。

2.正确使用命名空间

上面讲过了如何使用命名空间的两种方法。
这里重述一遍:

1.使用using namespace 命名空间名称 引入
2.加命名空间名称及作用域限定符
3.使用using将命名空间中某个成员引入

在之后的学习中,推荐使用第二种和第三种的结合

比如:

namespace dzt
{// 命名空间中可以定义变量/函数/类型int a = 0;int b = 1;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}using dzt::aint main()
{printf("%d\\n", a);return 0;
}

在一个命名空间域中,定义了多个变量和结构体以及函数。我们想访问该命名空间域的内容时,尽量不使用完全展开的方法,可以指定搜索某个变量即可。

总结:命名空间的出现是为了解决c语言的命名冲突问题。

三、C++中的输入和输出

C++中使用cout来进行输出,cin进行输入。
比如:

#include<iostream>
//引入库的头文件,该头文件包含cin,cout等关键字
using namespace std;
//让编译器可以去库里面搜索int main()
{double a = 10;//cin包括但不限于scanf//  >>是流提取运算符cin >> a ;//cout包括但不限于printf// <<是流插入运算符cout << a << endl;return 0;
}

在C++中的cin和cout是会自动识别类型的,关于如何自动识别,涉及到函数重载问题,后续会讲到。

由于C++是包含C的,所以cin和cout这种输入输出的效率会比C低一点点,因为cin和cout会自动识别类型,涉及到更复杂的实现。

在不同的情况下,可以cin,cout,scanf,printf结合使用。