C++ 比 C语言增加的新特性 3 之 命名空间namespace

1. 命名空间

1.1 命名空间

又称为“名字空间”,在内存(全局)中取一块区域并对其进行命名

实际例子:

同一个班级,两个同姓的人,例如:张三和张三,其中一个张三座位是在讲台右边,另外 一个张三座位是在讲台左边(将两个张三,放置在不同的区域里)

程序中,有两个一样的标识符(两个变量),编译器会提示标识符重名的问题,如何解决:将两个标识符放在不同的区域中

C++中的解决:

使用命名空间解决标识符重名的问题

1.1.1 有名空间

关键字:namespace

声明格式:	
	namespace   命名空间的名称    //名称符合C/C++语法规范即可
	{
		//代码
	}

1.1.1.1 直接访问:访问命名空间中指定的内容

符号:“  ::   ”,域作用符号

格式:

命名空间名称   ::    命名空间里的内容;

例如:

namesapce  zhangsan
	{
		int  a=10;
	}
	zhangsan::a   //访问名字空间中的变量a

main1.cpp


//直接访问有名空间中的变量
int a = 10;

void function()
{
	cout << "全局函数function" << endl;
}

void function1()
{
	cout << "这是全局的function1函数" << endl;
}
//有名空间
namespace zhangsan
{
	int a = 20;
	void function()
	{
		cout << "命名空间zhangsan中的function函数" << endl;
	}
}

//无名空间
namespace
{
	void function4()
	{
		cout << "这是无名的名字空间的function4()" << endl;
	}
}

int main()
{
	cout << "全局的a="<C++ 比 C语言增加的新特性 3 之 命名空间namespace_第1张图片

1.1.1.2 通过using关键字访问命名空间中指定的内容

关键字:using

格式:

using  命名空间名称    ::    命名空间中的内容;//将命名空间中的内容导入到using所在的空间中

例如:


	using  zhangsan ::a;

main1.cpp

//通过using关键字访问命名空间中指定的内容
namespace lisi
{
	int sum = 30;
	int num = 40;
}

using lisi::sum; //将sum变量导入到当前作用域中
using lisi::num;  //注释(取消)快捷键:ctrl+shift+/
int main()
{
	
	cout << "sum=" << sum << endl;
	cout << "num=" << num << endl;

	return 0;
}

C++ 比 C语言增加的新特性 3 之 命名空间namespace_第2张图片

1.1.1.3 通过using和namespace关键字访问命名空间中所有的内容

关键字:using、namespace

格式:

using   namespace   命名空间的名称  ;   //将命名空间里的所有内容导入到using\namespace所在的作用域(空间)中

例如:

using namespace zhangsan;
main1.cpp
//通过using和namespace关键字访问命名空间中所有的内容
namespace lisi {
	
	int b = 30;

}

using namespace lisi;
int main()
{
	cout << "b = " << b << endl;
}

C++ 比 C语言增加的新特性 3 之 命名空间namespace_第3张图片

1.1.1.4 命名空间也支持嵌套

格式:

        namespace      名称1

        {

                namespace  名称2

                {

                        namespace 名称3

                        {

                                ............

                         }

                   }

        }

main1.cpp

//命名空间也支持嵌套
namespace name1
{
	int  a = 30;
	namespace name2
	{
		int a = 40;
		namespace name3
		{
			int a = 50;
		}
	}
}

int main()
{
	cout << "name1  a=" << name1::a << endl;
	cout << "name2  a=" << name1::name2::a << endl;
	cout << "name3  a=" << name1::name2::name3::a << endl;
	
	return 0;
}

C++ 比 C语言增加的新特性 3 之 命名空间namespace_第4张图片

1.1.1.5 练习

有相同的函数,一个函数实现1 +2+3+ ... +n的和,个函数实现1 +2+3+ .. +n和的平均数,在main函数调用这两个函数,分别打印他们的和和和的平均数

main2.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "iostream"
using namespace std;

//命名空间
//有相同的函数, - 个函数实现1 + 2 + 3 + ... + n的和, - 个函数实现1 + 2 + 3 + .. + n和的平均数
// , 在main函数调用这两个函数,分别打印他们的和和和的平均数

int sum() {
	int num = 0;
	int n = 0;
	printf("请输入一个数:");
	scanf("%d",&n);
	for (int i = 1; i <= n;i++) {
		num += i;
	}
	return num;
}

namespace space2 {
	float sum() {
		int num = 0;
		int n = 0;
		printf("请输入一个数:");
		scanf("%d",&n);
		for (int i = 1; i <= n; i++) {
			num += i;
		}
		return num/(float)n;
		
	}
}



int main()
{
	
	cout << "全局的num=" << sum() << endl;

	cout << "命名空间的num=" << space2::sum() << endl;

	return 0;
}

C++ 比 C语言增加的新特性 3 之 命名空间namespace_第5张图片

1.1.2  无名空间

注:全局作用域其实质就是一个无名的名字空间

关键字:namespace
声明格式:	
	namespace     
	{
		//代码
	}

你可能感兴趣的:(C++,c++,c语言,linux)