https://blog.csdn.net/m0_64036070/article/details/123985674
目录
命名空间🍊
相信各位写代码的时候都会加上这么一句话
using namespace std;
namespace是啥意思?🍉
namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的namespace,但是由于现在的程序的规模越来越大,程序的分工越来越细,全局作用域变得越来越拥挤,每个人都可能使用相同的名字来实现不同的库,于是程序员在合并程序的时候就会可能出现名字的冲突。namespace引入了复杂性,解决了这个问题。namespace允许像类,对象,函数聚集在一个名字下。本质上讲namespace是对全局作用域的细分。
namespace的基本语法🍉
-
namespace identifier
-
{
-
entities;
-
}
举个栗子🔍
比如说这段代码
-
namespace first
-
{
-
int v=0;
-
}
::操作符🍉
这个符号各位一定都见过,如果你不加using namespace std;的话使用cout就需要std::cout
因为cout是包括在命名空间std里的,这个符号你可以理解为“的”,比如std的cout
namespace的基本使用🍉
前面也提到过,namespace的作用就是避免名字冲突,所以,在同一个程序里使用两个命名空间时变量名一样也不会引起名字冲突。
我们假设这两个命名空间分别为first和second,我们在这两个命名空间里定义两个变量,变量名都是var,写一个程序
-
#include <iostream>
-
using namespace std;
-
namespace first
-
{
-
int var = 5;
-
}
-
namespace second
-
{
-
double var = 3.1416;
-
}
-
int main () {
-
cout << first::var << endl;
-
cout << second::var << endl;
-
return 0;
-
}
VS运行结果
这个程序验证了上面的说法
using的用法🍉
using可以把一个命名空间引入程序中,比如这个程序
-
#include <iostream>
-
using namespace std;
-
namespace first
-
{
-
int x = 5;
-
int y = 10;
-
}
-
namespace second
-
{
-
double x = 3.1416;
-
double y = 2.7183;
-
}
-
int main () {
-
using first::x;
-
using second::y;
-
cout << x << endl;
-
cout << y << endl;
-
cout << first::y << endl;
-
cout << second::x << endl;
-
return 0;
-
}
VS运行结果
using导入整个命名空间🍉
-
#include <iostream>
-
using namespace std;
-
namespace first
-
{
-
int x = 5;
-
int y = 10;
-
}
-
namespace second
-
{
-
double x = 3.1416;
-
double y = 2.7183;
-
}
-
int main () {
-
using namespace first;
-
cout << x << endl;
-
cout << y << endl;
-
cout << second::x << endl;
-
cout << second::y << endl;
-
return 0;
-
}
运行结果
导入的整个的first的namespace,前一对x,y的值就是first中的x,y的值。
这里我们不能在“using namespace first;“下加一句“using namespace second;“,为什么呢?
这样做无异于直接完全的忽视namespace first和namespace second,会出现重复定义的结果
举个例子🍉
我们通常坚持使用显式的限定,并且仅将using指令局限在很小的作用域中,这样他们的效用就会受到限制并且易于使用。
-
#include <iostream>
-
using namespace std;
-
namespace first
-
{
-
int x = 5;
-
}
-
namespace second
-
{
-
double x = 3.1416;
-
}
-
int main () {
-
{
-
using namespace first;
-
cout << x << endl;
-
}
-
{
-
using namespace second;
-
cout << x << endl;
-
}
-
return 0;
-
}
运行结果
可以看到两个不同的namespace都被限制在了不同作用域中了,他们之间就没有冲突。
namespace嵌套🍉
-
#include <iostream>
-
namespace first
-
{
-
int a=10;
-
int b=20;
-
namespace second
-
{
-
double a=1.02;
-
double b=5.002;
-
void hello();
-
}
-
void second::hello()
-
{
-
std::cout <<"hello world"<<std::endl;
-
}
-
}
-
int main()
-
{
-
using namespace first;
-
std::cout<<second::a<<std::endl;
-
second::hello();
-
}
运行结果
在namespace first中嵌套了namespace second,seond并不能直接使用,需要first来间接的使用
给命名空间取别名🍉
-
#include<iostream>
-
using namespace std;
-
namespace veryLongName {
-
int a = 10;
-
void func() { cout << "hello namespace" << endl; }
-
}
-
void test() {
-
namespace shortName = veryLongName;
-
cout << "veryLongName::a : " << shortName::a << endl;
-
veryLongName::func();
-
shortName::func();
-
}
-
int main()
-
{
-
test();
-
return 0;
-
}
运行结果