C++57个入门知识点_10_ 名字空间域定义及作用(namespace、::、四饼连接符、同一作用域可分开使用、可嵌套使用、可取别名、内部可定义变量和定义函数、其中可使用全局变量)

接上篇:C++57个入门知识点_09_ 作用域与数据隐藏(作用域的分类、数据隐藏、不同作用域中定义了相同名称的变量,其值不是覆盖,而是存储在不同的地址下,根据作用域(从内->外)查找使用、2.1例子),本篇将介绍项目中经常使用的名字空间域,不仅在C++中其他语言也有使用,但是有不同的叫法。

总结放于前:

1.名字空间域定义: 是一种自定义作用域的方式,用于区分项目中模块和组件,主要是解决名字冲突的问题。

2.名字空间域的使用:

  • 关键字namespace,::用于表示作用域,有意思的称呼“四饼连接符”
  • 同一作用域可以分开使用
  • 名字空间域可以嵌套使用
  • 名字空间可以取别名
  • 名字空间内不仅可以定义变量,也可以定义函数
  • 在名字作用域中可以使用全局变量

在项目中同一个变量名可能会存在于不同的作用域,如果我想使用不同作用域下的变量值该怎么去做呢?这个过程中可能出现的名字冲突,数据隐藏的问题该怎么解决呢?

现实生活中,三班有一个张三,四班也有一个张三,在班级内部喊张三,名字跟人是唯一对应的,在年级开会时,要表扬张三同学,只说名字肯定会不明确是谁,这个时候就需要加上班级信息,三班张三的第一了,四班张三得到批评了。

程序中给变量加上前缀,有前缀的修饰之后就可以准确定位到指定的变量。

1. 名字空间域定义

  • 是一种自定义作用域的方式,用于区分项目中模块和组件,主要是解决名字冲突的问题。
  • 名字空间域的关键字:namespace,::用于表示作用域,有意思的称呼“四饼连接符”
    其使用的方法如下:
#include <iostream>

//ShellMad名字空间
namespace ShellMad 
{
	int nWidth = 6;
}

int main(int argc, char* argv[])
{
	ShellMad::nWidth = 7;

	return 0;
}

其中ShellMad::nWidth 就代表了ShellMad中的nWidth

ShellMad作为前缀,nWidth作为内容,::用于表示作用域,有意思的称呼“四饼连接符”哈哈!

当其他名字空间也有nWidth时,可以如下去写:

#include <iostream>

//ShellMad名字空间
namespace ShellMad 
{
	int nWidth = 6;
}

//Ali名字空间
namespace Ali
{
	int nWidth = 5;
}

int main(int argc, char* argv[])
{
	ShellMad::nWidth = 7;
	Ali::nWidth = 8;
	return 0;
}

运行结果:不同名字空间下的nWidth对应不同的值
在这里插入图片描述

2.名字空间域的使用

2.1 同一作用域可以分开使用

变量只要是定义在名字作用域中,可以在不同地方定义,效果等同于声明的一个位置

//ShellMad名字空间
namespace ShellMad 
{
	int nWidth = 6;
}

namespace ShellMad
{
	int nHeigh = 6;
}

int main(int argc, char* argv[])
{
	ShellMad::nWidth = 7;
	ShellMad::nHeigh = 7;
	return 0;
}

只要在定义变量时,将变量写在namespace ShellMad{xxxx}中,变量就处于同一个作用域中。取地址也可以看到其内存地址是相近的。
在这里插入图片描述

2.2 名字空间域可以嵌套使用

名字空间域的里面再定义名字空间域。调用方式:ShellMad::ShellGame::nMoney = 400;

定义及使用如下:

#include <iostream>

//ShellMad名字空间
namespace ShellMad 
{
	int nWidth = 6;

	//名字空间域的嵌套使用
	namespace ShellGame {
		int nMoney;
	};
}

int main(int argc, char* argv[])
{
	ShellMad::ShellGame::nMoney = 400;
	return 0;
}

2.3 名字空间域可以取别名

当我们觉得现有的名字空间域的名字太复杂,想要给名字空间域的起别名可以采用如下方式:namespace newName=oldName

具体例子如下:

#include <iostream>

//ShellMad名字空间
namespace ShellMad 
{
	int nWidth = 6;

	//名字空间域的嵌套使用
	namespace ShellGame {
		int nMoney;
	};
}

namespace n = ShellMad;

int main(int argc, char* argv[])
{
	n::ShellGame::nMoney = 300;
	return 0;
}

也可以起别名起的更深一些:
定义:namespace n = ShellMad::ShellGame;客户调用时:n::nMoney=300

2.4 名字空间域内不仅可以定义变量,也可以定义函数

#include <iostream>
//全局作用域的nWidth
int nWidth = 9;

//ShellMad名字空间
namespace ShellMad 
{
	int nWidth = 6;

	//名字空间域的嵌套使用
	namespace ShellGame {
		int nMoney;
	};
//名字空间域中的函数
	void foo() {

		nWidth = 100;

	}
}
//全局总用于的nWidth
int nWidth = 9;
int main(int argc, char* argv[])
{
//名字空间域中的函数调用
	ShellMad::foo();
	return 0;
}

那么在void foo() 中的nWidth = 100;是全局的还是名字空间域的中nWidth
根据上篇的内容知道,编译器会从内向外找,那么此处的nWidth应该是名字空间域的中的,实际运行也是如此。

2.5 在名字作用域中使用全局变量的方法

那可以在名字空间域中使用全局变量吗?答案是肯定的,具体写法如下:::nWidth = 1001;

#include <iostream>

//全局作用域的nWidth
int nWidth = 9;

//ShellMad名字空间
namespace ShellMad 
{
	int nWidth = 6;

	//名字空间域的嵌套使用
	namespace ShellGame {
		int nMoney;
	};

	void foo() {

		nWidth = 100;

		//在局部表示全局作用域的表示形式
		::nWidth = 1001;
	}
}

int main(int argc, char* argv[])
{
//名字空间域中的函数调用
	ShellMad::foo();
	return 0;
}

注意:调用全局变量要在定义之后,需要将全局变量定义在最前面。

3. 学习视频地址:C++57个入门知识点_10_ 名字空间域定义及作用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值