有任何不懂的问题可以评论区留言,能力范围内都会一一回答
今天是暑期第一天开始写c++笔记,新起点,新开始加油
我们先来看两串代码
这串代码编译没有问题
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int rand = 14;
int main(void) {
int rand = 14;
printf("%d\n", rand);
return 0;
}
但是如果我加一个头文件#include<stdlib.h>就无法编译了
这个地方编译错误说明的很清楚了,从宏那个章节我们知道 头文件里面定义函数,而该函数名和我们定义的全局变量rand冲突了,但是如果我们定义局部变量rand编译就会通过。
但是一旦涉及大项目,我们两个命名的变量一样就会出错,C改起来很麻烦很麻烦,于是C++就出现了域这个概念
首先我们要引入域这个概念,域可以类比空间来理解,局部域可以类比理解成局部空间。
我们可以用namespace去定义一个域
我们使用同一个变量或者函数时,会从局部局部域去寻找,再到全局域寻找,但是如果在局部域里面我想用全局域怎么办呢?或者说如果我想到其他域搜索值怎么办呢?
比如这串代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int a = 1;//全局域的a
namespace ly//定义ly这个域
{
int a = 2;//ly这个域的a
}
int main(void) {
int a = 3;//局部域的a
return 0;
这个地方三个三个a的值,我们如果想用局部域的a怎么用,首先我们要理解如果我们直接
printf("%d",a);它会现在局部域(当下的语句所处的域)中找a的值,然后再去全局域找值,那么如果全局域也没有值,它会不会去其他域找值呢?显然是不会的,那么像上面那个代码的例子,我们该如何使用全局域或者其他域的值呢?C++给我们提供了一个新方法那就是::符号,比如ly::a就代表ly域中的a,::a就代表全局域的a,这样C++就避免了原先c的不足之处了
像这样我们想用哪个域的值就可以直接通过::符号直接用了,也就是指定访问
当然对于命名空间域还有另一种方式,就是展开命名空间域 ,也就是using namespace,比如我要展开ly这个域,那就直接using namespace ly就可以了,命名空间域展开后该域里面的变量都会变成全局变量。
很明显命名域被展开后,命名域里面的变量会变成全局变量 。
这也就是为什么我们用C++时常写一句
using namespace std;
std是C++的标准库
当然头文件通过using namespace 展开是将头文件的类容拷贝到代码里面来
当然我们展开也就意味着会有会出现变量重名的问题,也就是文章最初的问题,我展开后如果该域中的a变量变成了全局变量,全局域中也有一个变量a,且a的值还不一样,这样会导致报错。
因此我们平时练习可以展开,但是项目时不建议展开。
那么有没有好用的办法呢?显然有,那就是把常用的那部分展开就可以了也就是局部展开
比如using std ::cout
比如using std ::endl