一、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结合使用。