命名空间【C++】

本文详细介绍了C++中的命名空间,包括其概念、定义方式和使用方法,如作用域限定符、using声明和using namespace。通过命名空间,可以有效地避免标识符冲突,提高代码的组织性和可读性。同时,文章还探讨了命名空间的外部定义、嵌套以及如何通过别名简化使用。
摘要由CSDN通过智能技术生成

命名空间【C++】

一、概念及意义

        在C++中,名称(name)可以是符号常量、变量、函数、类和对象等等,而这些名称都是大量存在的,这些名称可能会存在于全局作用域中,为避免程序员在使用各种各样的C++库时,与这些标识符产生冲突。所以,C++引入了关键字namespace(命名空间),来更好的控制标识符的作用域。因此使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。

        我们在编写程序的时候,或多或少遇到过这样的情况:你在编写一些xxx()函数的过程中,并且有些可能用到的库,在这些库中,它也有命名为xxx()的函数。然后编译器在编译的时候不知道你引用的是哪个xxx()函数。命名空间就是用来解决这种类似的问题的。

二、命名空间的定义

namespace 命名空间 {
    声明序列(可选)
}

命名空间的成员是定义的命名空间的花括号里面声明的名称。

内部定义:在命名空间的定义内,声明并定义命名空间的成员。

外部定义:只在命名空间的定义内声明成员,而在命名空间的定义之外,定义命名空间的成员。外部定义的格式:命名空间名 :: 成员名......

Example:

namespace name1 {           // 命名空间name1的定义
    int i;                  // 命名空间name1的成员i的内部定义
    void f() {              //命名空间name1的成员f()的内部定义
        i++;
    }
    void g();               // 命名空间name1的成员g()的声明

    namespace name2 {       // 子命名空间name2的内部定义(命名空间的嵌套)
        int i;              // 命名空间name2的成员i的内部定义
        void f() {          // 命名空间name2的成员f()的内部定义
            i++; }
        void g();           // 命名空间name2的成员g()的声明
    }
}

void name1::g() {           // 命名空间name1的成员g()的外部定义
    i--;
}
void name1::name2::g() {    // 命名空间Inner的成员g()的外部定义
    i--;
}

注意: 

(1)不能在命名空间的定义中声明字命名空间,只能定义字命名空间(即嵌套);

(2)不能在外部定义字命名空间;

(3)不能在外面直接使用“命名空间名::成员名......”来添加新成员,必须在命名空间里先声明才能用外部定义的方法来定义;

(4)可以通过【多次声明和定义同一命名空间,每次添加新成员】的方法来添加新成员。

三、命名空间的使用

1、作用域限定符(::)

        对命名空间里的成员的使用需要利用作用域限定符(::),因为命名空间里的成员相当与有一个域的包装。

#include <iostream>
using namespace std;

namespace name1 {
	int a = 1;
	int b = 2;
	int add(int x, int y) {
		return x + y;
	}
}

int main() {
	cout << name1::a << endl << name1::b << endl;
	cout << name1::add(1,2) << endl;
}

/*输出结果为:
1
2
3
*/

2、using声明(部分展开)

        此方法只会展开命名空间里的部分成员。格式为:using 命名空间名 :: 成员名

#include <iostream>
using namespace std;

namespace name1 {
	int a = 1;
	int b = 2;
	int add(int x, int y) {
		return x + y;
	}
}

using name1::a;
int main() {
	cout << a << endl;
	cout << name1::b << endl;
}

/*输出结果为:
1
2
*/

3、using namespce(全部展开)

        此方法展开命名空间里的全部成员。格式为:using namespace 命名空间名;

#include <iostream>
using namespace std;

namespace name1 {
	int a = 1;
	int b = 2;
	int add(int x, int y) {
		return x + y;
	}
}

using namespace name1;
int main() {
	cout << a << endl;
	cout << b << endl;
	cout << add(1, 2) << endl;
}

/*输出结果为:
1
2
3
*/

四、命名空间取别名

        C++引入命名空间,主要是为了避免成员的名称冲突。如果用户都给自己的命名空间取简短的名称,那么这些命名空间本身,也可能发生名称冲突。如果为了避免冲突,而为命名空间取很长的名称,则使用起来就会不方便。这是一个典型的两难问题。

        C++为此提供了一种解决方案 —— 命名空间别名,格式为:namespace 别名 = 命名空间名;

参考链接:

(1)https://blog.csdn.net/touzani/article/details/1637776

(2)https://blog.csdn.net/ETalien_/article/details/86031470

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

周小周OvO

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

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

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

打赏作者

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

抵扣说明:

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

余额充值