暑期c++ 命名空间

有任何不懂的问题可以评论区留言,能力范围内都会一一回答

今天是暑期第一天开始写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

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值