文章目录
- 一、C++中的关键字
- 二、命名空间
- 1.命名空间规则
- 展开命名空间域 和 #include 的区别
- 2.正确使用命名空间
- 三、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,是不行的,编译器报的错误是:
”未声明的标识符“
所以我们想要获得命名空间域的内容,
using namespace dzt;
我们把这句代码加入到命名空间dzt下面就可以执行了。
这句代码的意思是:展开我的命名空间域dzt。
此时编译不会出现问题。
展开命名空间域 和 #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::a
int 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结合使用。