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




