C++ -命名空间-详解

在C++中,创造了一个关键字namespace ,用来解决全局域中命名冲突的问题。

1 定义

命名空间可以定义出一个域,将其中的内存隔离在这个独立区域,不会与其他区域中的名字冲突:

namespace ly
{
	int rand = 0;
}

2 使用

有三种域,局部域、全局域、命名空间域。
在一些C++程序开头,常常看见下面这两句代码:

#include 
using namespace std;

意思是展开了C++标准库的命名空间域。
将命名空间域中的内容全部暴露到全局域,而同一个域不能定义同名变量。
所以以下内容 错误

#include 
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对象作为函数的第一个参数

你可能感兴趣的:(c++,开发语言)