C++入门之命名空间

Posted 可乐不解渴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++入门之命名空间相关的知识,希望对你有一定的参考价值。

命名空间

在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。

1.普通的命名空间

//1. 普通的命名空间
namespace Cool   // 这里的N为命名空间的名称
{
    // 命名空间中的内容,既可以定义变量,也可以定义函数,如下:
    int val;
    int Add(int x, int y)
    {
        return x + y;
    }
}

2.嵌套命名空间

namespace N2
{
    int val1;
    int val2;
    int Add(int x, int y)
    {
        return x + y;
    }

    namespace N3
    {
        int val3;
        int val4;
        int Sub(int x, int y)
        {
            return x -y;
        }
    }
}

3.同名命名空间合并

// 3.同一个工程中允许存在多个相同名称的命名空间, 编译器最后会合成同一个命名空间中。
//这里的命名空间N与1中的命名空间如果在同一个工程中,最后会被编译器合成为同一个命名空间
namespace N
{
    int Mul(int x, int y)
    {
        return x * y;
    }
}

示例

命名空间中成员该如何使用呢?比如:

#include<stdio.h>
#include<string.h>
/*
命名冲突
c语言的库里面,有两个函数用scanf和strlen名称
假设我们的代码中想用这两个名称命名变量
*/
namespace cola
{
    int scanf = 10;
    int strlen = 100;
    int Add(int x, int y)
    {
        return x + y;
    }
}
int main()
{
    // 默认访问的局部或者全局   先找局部的名称,局部没有再找全局
    printf("%x\\n", scanf);				//   函数的地址
    printf("%x\\n", strlen);				//   函数的地址

    // 指定访问cola命名空间中的元素
    printf("%x\\n", cola::scanf);		//     a
    printf("%x\\n", cola::strlen);		//     64

    //此时我们想要调用cola中的函数
    int ret = cola::Add(1, 2);
    std::cout << ret << std::endl;		//     3
    return 0;
}

此时我们打印的结果如下图所示:
在这里插入图片描述

使用标准库的三种方法

在学校学习,有些老师可能会和你说#include<iostream>using namespace std;就是要配套着使用的,这会导致我们错误的认为我们这两个东西就是写c++程序必须要的,其实不然。
C++库为了防止命名冲突,把自己库里面的东西都定义在一个std的命名空间中,我们要使用标准库中的东西,有以下三种方式:

1.指定命名空间—最规范的方式

缺点:这种书写代码会比较麻烦,每个地方要用都要指定命名空间。
如下代码:

#include<iostream>
int main()
{
    std::cout << "Hello World_1" << std::endl;
    return 0;
}

结果如下:
在这里插入图片描述

2.把std整个展开,相当于库里面的东西都到全局域

缺点:这样看起来方便了,但如果我们自己定义的东西与库中的冲突了就没有办法解决了。(规范的工程中不推荐使用该种方式)
如下代码:

#include<iostream>
using namespace std;
int main()
{
    cout << "Hello World_2" <<endl;
    return 0;
}

结果如下:
在这里插入图片描述

3.对部分常用的库中东西进行展开

该方法是针对方法1与方法2的折中方案。(项目中也会经常使用)
如下代码:

#include<iostream>
using std::cout;
using std::endl;
int main()
{
    cout << "Hello World_3" << endl;
    return 0;
}

结果如下:
在这里插入图片描述

面试题

题目:用C++写一个Hello World
你敢相信这是一道腾讯的面试题吗?
有人上手就写出了如下代码

#include<iostream>
using namespace std;
int main()
{
    cout << "Hello World" <<endl;
    return 0;
}

但真的就这么简单吗?如果按上述这种写法有可能你的面试就到此与止了。那么这道题的考察点是什么呢?
其实考察的就是我们命名空间
标准写法如下:

#include<iostream>
int main()
{
    std::cout << "Hello World" << std::endl;
    return 0;
}

或许你写完上述代码后,面试官可能还会接着深入询问这里的std是什么,为什么要怎么做。
这里就需要大家自行答辩了。
END...

以上是关于C++入门之命名空间的主要内容,如果未能解决你的问题,请参考以下文章

C++入门篇之关键字,命名空间,输入输出和函数重载

C++快速入门(命名空间,输入输出,缺省函数,函数重载)

C++快速入门(命名空间,输入输出,缺省函数,函数重载)

C++入门(命名空间缺省参数函数重载引用内联函数)

C++从学渣到学霸之了解C++

C++ 入门超详解!