C++ -命名空间-详解
在C++中,创造了一个关键字namespace ,用来解决全局域中命名冲突的问题。
1 定义
命名空间可以定义出一个域,将其中的内存隔离在这个独立区域,不会与其他区域中的名字冲突:
namespace ly
{int rand = 0;
}
2 使用
有三种域,局部域、全局域、命名空间域。
在一些C++程序开头,常常看见下面这两句代码:
#include <iostream>
using namespace std;
意思是展开了C++标准库的命名空间域。
将命名空间域中的内容全部暴露到全局域,而同一个域不能定义同名变量。
所以以下内容 错误
#include <stdio.h>
int a = 0;//全局域--全局变量
namespace ly
{int a = 2;//命名空间域
}
using namespace ly;//展开命名空间域
int main()
{printf("%d\n", a);return 0;
}
3.C++ 标准库中的命名空间
C++无.h, 为了与C语言进行区分,并且有了命名空间,C++库、STL等被封进std,这时.h就没有了。
标准库通过std命名空间进行管理,在 C++ 的标准库中,所有的库函数和对象都封装在 std 命名空间中。
使用标准库时,可以选择指定访问,例如:使用标准库时,可以选择指定访问,例如:使用标准库时,可以选择指定访问,例如:使用标准库时,可以选择指定访问,例如:
std::cout << "Hello World!" << std::endl;
或者展开空间:(这个展开并非展开头文件,因此,展开std不等于不包含头文件!!) 不建议这样使用
using namespace std;
cout << "Hello World!" << endl;
直接展开会有风险,如果自己定义的跟库重名,就会报错,这不就直接回到起点,将C语言的缺点再次包含。
因此,建议在项目中不要展开,而是指定访问;而日常练习中可以展开。
下面只需将常用的展开,不常用的再指定访问,就能大大减少工作量,使用"using"关键字将"cout"、"endl"和"sqrt"符号从它们各自的命名空间中引入到我们当前的作用域中。使得我们可以在不使用命名空间前缀的情况下使用它们。
using std::cout;
using std::endl;
cout << "Hello World!" << endl;
这段代码是一个using声明,它将Camera类中的setVideoQuality函数引入到当前作用域中,以便可以在不需要使用Camera作为前缀的情况下使用该函数。这种方法也称为using指令或using编译指令。
#include "Camera.h"int main() {Camera cam;cam.setVideoQuality(720);return 0;
}
4.引入类中的函数
另一种使用方法:可以使用using声明将setVideoQuality函数引入到当前作用域中:
#include "Camera.h"
using Camera::setVideoQuality;int main() {Camera cam;setVideoQuality(cam, 720);return 0;
}
可以直接调用setVideoQuality函数,而不需要使用Camera作为前缀。注意,在这种情况下,我们需要传递Camera对象作为函数的第一个参数。