C++入门篇--命名空间

C++入门篇–命名空间

C++是一门很优秀的语言,C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。所以C++是一种面向对象的语言。要学C++得有c语言得基础,这样学着会稍微轻松一点。我感觉,C++是在弥补C的不足之处,接下来我们就来讲讲C++的一些新东西。

命名空间 namespace

在C/C++中,变量、函数和类都是会大量存在的,当变量、函数等等都大量存在的时候,有可能会发生命名冲突。再举个例子,在一个大型的项目中,肯定是有一个团队分工合作,一人实现一部分功能,再整合起来。这个时候就可能会出现,几个同伴对于变量的命名出现冲突。所以就有了命名空间。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字就是针对这种问题

命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{},把变量、函数名等定义或申明在花括号中。

namespace mynamespace {
    //命名空间中的内容可以定义变量,也可以定义函数
    int a; // 定义变量
    // 定义函数
    void swap(int* num1, int* num2){
        int tmp = *num1;
        *num1 = *num2;
        *num2 = tmp;
    }
}

命名空间看似陌生,其实可以把命名空间看作是一个域,这个域可以把变量、函数等隔离开,但是命名空间中成员的属性是不变的,如果成员是全局变量,向上面那样定义它依然是全局变量,只不过使用的方式和普通变量略微有些不同,下面会讲到。


我们知道,代码块是可以嵌套的,同样,命名空间也是可以嵌套的,语法如下

namespace mynamespace2{
    int a;
    int b = 0;
    void swap(int* num1, int* num2){
        int tmp = *num1;
        *num1 = *num2;
        *num2 = tmp;
    }
  	namespace mynamespace2_2{
      	int c;
        int d;
        int sub(int left, int right){
            return left-right;
        }
  	}  
}

到这里,我们可能回想,命名空间确实是解决了变量名冲突的问题,那么如果两个命名空间的名字一样了呢,会冲突吗?答案是不会冲突。如果有两个名字一样的命名空间,那么这两个命名空间的成员会和到一起。


命名空间使用

命名空间怎么定义,以及命名空间的用途我们都知道了,接下里就学学怎么使用命名空间。使用命名空间,需要用到using关键字。如果不用using关键字,直接使用命名空间中的变量,编译器会显示,变量未定义。结果如下图

在这里插入图片描述


命名空间的使用有三种方式

  • 命名空间名称以及作用域限定符(::)
int main(){
    printf("%d\n", mynamespace::a);
    return 0;
}

在这里插入图片描述


  • 使用using将命名空间中成员引入
using mynamespace::b;
int main(){
    printf("%d", b);
}

在这里插入图片描述

ps:将命名空间中的成员你引入之后,在使用成员时,就不需要再变量前面加命名空间名称和作用域限定符。


  • 使用using namespace 命名空间名称引入
using namespace mynamespace;
int main(){
    a = 10;
    b = 20;
    swap(&a, &b);
    printf("a = %d  b = %d", a, b);
    return 0;
}

在这里插入图片描述


  • 嵌套命名空间的使用
namespace mynamespace2 {
    int a;
    int b = 0;
    void swap(int* num1, int* num2) {
        int tmp = *num1;
        *num1 = *num2;
        *num2 = tmp;
    }
    namespace mynamespace2_2 {
        int c;
        int d;
        int sub(int left, int right) {
            return left - right;
        }
    }
}
using namespace mynamespace2;
using namespace mynamespace2::mynamespace2_2;
int main()
{
    printf("%d\n", mynamespace2::mynamespace2_2::c); // 不使用using,就得在变量名前面加上两个命名空间名称和作用域限定符
    printf("%d\n", b);
    d = 10;
    b = 20;
    swap(&a, &b);
    printf("a = %d  b = %d", a, b);
}

总结

虽然使用命名空间的方式有很多种,但最好的还是第一种,它虽然麻烦,但它实现了隔离冲突域的功能,如果用using将整个命名空间展开,就是去了隔离冲突域的功能。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_yiyi_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值