欢迎光临
我们一直在努力

【C++ 入门】命名空间 namespace 超详解:从 Hello World 到告别命名冲突

【C++ 入门】命名空间 namespace 超详解:从 Hello World 到告别命名冲突

那基础必须先来一套Hello World!开开胃喽~

#include <iostream>
using namespace std;

int main()
{
cout<<"Hello World!"<<endl;
return 0;
}

这怎么和C语言里的差别这么大,这里的std,cout等我们都看不懂,没关系,接下来我将依次讲解。

命名空间

namesspce存在的意义

在 C 和 C++ 代码里,会写很多变量、函数,后面还要学类。这些东西的名字,如果全都扔在同一个全局范围里,就很容易出现名字撞车。

命名空间就是用来解决这个事儿的:把各种名字做个分组隔离,防止重名打架。C++ 专门搞出namespace这个关键字,就是为了解决命名冲突、名字污染的问题。

C 语言写项目的时候,经常就会遇到函数、变量重名冲突。C++ 引入命名空间,就是为了更好处理这种重名麻烦。

#include <stdio.h>
#include <stdlib.h>

int rand = 10;
int main()
{
printf("%d\\n", rand);
return 0;
}

在这里插入图片描述

namespace的定义
  • 想要创建命名空间,就用 namespace 关键字,后面写上命名空间的名字,再跟上一对大括号 {},大括号里面放的就是这个命名空间里的内容。变量、函数、自定义类型都可以写在命名空间里面。

  • namespace 说白了就是开辟一块独立的名字区域,它和全局区域互不干扰。不同的区域里可以用一模一样的变量名,这样之前 rand 那种重名冲突问题就不会出现了。

  • C++ 里一共有好几种域:函数内部的局部域、全局域、命名空间域,还有后面要学的类域。域的作用,就是告诉编译器该去哪里找变量、函数、类型的定义。靠域把名字隔开,就能避免重名打架。
    要注意:局部域和全局域不光决定编译器怎么找名字,还会控制变量能存活多久;但命名空间域和类域,只管名字查找,不会改变变量的生命周期。

  • namespace 要写在全局位置,同时命名空间还支持嵌套,一个命名空间里面可以再套另一个命名空间。

  • 如果是多文件的项目,不同源文件里写名字相同的 namespace,编译器会把它们当成是同一个命名空间,不会报冲突错误。

  • 另外 C++ 的标准库所有内容,全都放在名叫 std(代表标准)的命名空间里面。

#include <iostream>
#include <stdlib.h>

//1.正常的命名空间定义
//2.lc是命名空间的名字,一般开发中是用项目名字做命名空间名
namespace lc
{
//命名空间中可以定义变量/函数/类型
int rand = 10;
int Add(int x, int y)
{
return x + y;
}

struct Node
{
int x;
struct Node* next;
};
}

int main()
{
//这里访问的是全局的rand函数指针
printf("%p\\n",rand);
//这里指针lc命名空间的rand
printf("%d\\n,",lc::rand);

return 0;
}

命名空间的嵌套使用

// 命名空间可以嵌套定义
namespace lc
{
namespace A
{
int rand = 10;
int Add(int x, int y)
{
return x + y;
}
}
namespace B
{
int rand = 20;
float Add(float x, float y)
{
return x + y;
}
}

}
int main()
{
printf("%d\\n", lc::A::rand);
printf("%d\\n", lc::B::rand);

printf("%d\\n", lc::A::Add(5, 7));
printf("%.2f\\n", lc::B::Add(3.4, 5.7));
}

在这里插入图片描述
我们在项目组里也可以进行命名空间的嵌套
我们在项目组里也可以进行命名空间的嵌套

  • 多文件中定义同名命名空间会自动合并,就像在同一个命名空间里一样。
命名空间的使用

编译器找变量、函数的定义的时候,默认只会去局部范围或者全局范围找,不会自动跑到命名空间里面去找。所以直接写代码就会编译报错。

想要使用命名空间里面的变量或者函数,一共有三种写法:

  • 写清楚是哪个命名空间的再访问,正式做项目优先用这个,最稳妥。
  • using 单独把命名空间里某一个成员拿出来用,如果某个成员会频繁使用,而且确定不会出现名字冲突,可以用这种。
  • 把整个命名空间里面所有东西全部放开直接用,实际开发不建议这么写,很容易引发名字冲突;只是自己写小 demo 练习的时候,图省事可以用。
  • 命名空间部分展开:

    using std::cout;
    int main()
    {
    int a, b;
    cout << "可以直接用cout,只展开了cout" << '\\n';
    std::cin >> a >> b; // 输入
    cout << a << b;
    }

    部分展开了之后cout就不需要在前面加东西了,但是cin还是要的
    命名空间全部展开:

    using namespace std;
    int main()
    {
    int a, b;
    cout << "可以直接用cou和cin" << endl;
    cin >> a >> b; // 输入
    cout << a << b << endl;
    }

    这里就都不需要指定命名空间去访问了,平常刷题和写小项目时使用起来确实是很方便的,大的项目 还是推荐大家不要这样用。

    赞(0)
    未经允许不得转载:171主机测评 » 【C++ 入门】命名空间 namespace 超详解:从 Hello World 到告别命名冲突
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址