在c语言的学习中,我们知道,命名不能相同,否则会报错导致程序崩溃,但是有时候为了方便理解,我们需要用同一个名字来命名同一个函数或变量,C++就提供了一些方法来解决这类问题。
一.命名空间
1.命名空间的创建:
命名空间是C++中的一个关键字 (namespace) ,使用方式如下所示:(名为MySort的命名空间)
namespace MySort {
double exa = 2.5;
void Swap(int* a, int* b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
void Sort(int* a, int n) {
int i, j;
for (i = 0; i < n; i++) {
for (j = i; j < n; j++) {
if (a[j] < a[i])
Swap(&a[j], &a[i]);
}
}
}
}
2.命名空间的使用
①:作用域
命名空间相当于开辟了一个新的作用域,它定义的内容也局限于这个作用域,因此在命名空间外部不能直接调用命名空间内部的内容。
②:调用
1.由于命名空间定义了一个全新的作用域,因此需要添加作用域限定符来调用,如下:
namespace Example {
void LVHT() {
;
}
}
int main() {
Example::LVHT();//需要作用域限定符来找到作用域来调用
return 0;
}
2.如果想要直接调用命名空间内的函数,我们可以用using(关键字)将其展开,如下:
namespace Example {
void LVHT() {
;
}
}
using namespace Example;
int main() {
LVHT();//这里就可以直接调用了
return 0;
}
3.我们可以选择展开部分内容,也就是只允许这部分内容在命名空间外直接使用,如下:
namespace Example {
void LVHT() {
;
}
void LOVEHT(){
;
}
}
using Example::LOVEHT;
int main() {
//LVHT;//这里不能直接调用会报错
Example::LVHT();
LOVEHT();//这里可以直接调用
return 0;
}
4.C++标准库中的函数或者对象都是在std中定义的,因此我们想要直接调用C++标准库的内容时需要将std展开或者展开需要使用的部分。(如果不展开则需要std::来找到需要使用的内容)
#include <iostream>
using namespace std;
int main() {
cout << 1.1 << endl;//cout可以自动识别内置类型输出
std::cout << 1.1 << std::endl;//如果不展开需要这样调用
return 0;
}
③:嵌套
命名空间允许嵌套,如下所示:
namespace Example1 {
int a = 0;
int b = 0;
namespace Example2 {
int c = 0;
}
}
using namespace Example1::Example2;
int main() {
Example1::Example2::c = 1;
cout << Example1::Example2::c << endl;
c = 3;
cout << c << endl;
return 0;
}
(命名空间嵌套后调用Example2需要添加两次作用域限制符,同样展开也需要两次)
④:合并
当一个项目里有多个相同名字的命名空间时系统会自动将其合并,如下:
namespace Example {//这个在.cpp文件中
void LVHT(){
cout << "NOE" << endl;
}
}
namespace Example {//这个在.h文件中
void LOVEHT() {
cout << "OE" << endl;
}
}
int main() {
Example::LOVEHT();
Example::LVHT();
return 0;
}