【C++干货基地】namespace超越C语言的独特魅力
文章目录
C++
又叫Cplusplus
其实就是C语言的升级版啦,是,Bjarne Stroustrup博士 在1982年在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为为了表达该语言与C语言的渊源关系,命名为C++。
- 所以我们说C++ 是 C语言的升级版,下面我们就来看C++究竟升级了那些部分吧?
我们大家都知道 世面上最火的俩门语言分别是 java 和 C/C++ 而C/C++ 2022的份额加起来甚至超过了%20还多。一度成为年度最热语言
上图数据来自TIOBE编程语言社区近几年的排行榜,在30多年的发展中,C/C++几乎一
致稳居前5。
🔥 注意:排名不能说明那个语言好,那个不好,每门编程语言都有适应自己的应用场景。
- 操作系统以及大型系统软件开发
所有操作系统几乎都是C/C++写的,许多大型软件背后几乎都是C++写的,比如:
Photoshop、Office、JVM(Java虚拟机)等,究其原因还是性能高,可以直接操控硬件。
- 服务器端开发
后台开发:主要侧重于业务逻辑的处理,即对于前端请求后端给出对应的响应,现在主流采
用java,但内卷化比较严重,大厂可能会有C++后台开发,主要做一些基础组件,中间件、
缓存、分布式存储等。服务器端开发比后台开发跟广泛,包含后台开发,一般对实时性要求
比较高的,比如游戏服务器、流媒体服务器、网络通讯等都采用C++开发的。
- 游戏开发
PC平台几乎所有的游戏都是C++写的,比如:魔兽世界、传奇、CS、跑跑卡丁车等,市面上
相当多的游戏引擎都是基于C++开发的,比如:Cocos2d、虚幻4、DirectX等。三维游戏领
域计算量非常庞大,底层的数学全都是矩阵变换,想要画面精美、内容丰富、游戏实时性
搞,这些高难度需求无疑只能选C++语言。比较知名厂商:腾讯、网易、完美世界、巨人网
络等。
- 嵌入式和物联网领域
嵌入式:就是把具有计算能力的主控板嵌入到机器装置或者电子装置的内部,能够控制这些
装置。比如:智能手环、摄像头、扫地机器人、智能音响等。
谈到嵌入式开发,大家最能想到的就是单片机开发(即在8位、16位或者32位单片机产品或者
裸机上进行的开发),嵌入式开发除了单片机开发以外,还包含在soc片上、系统层面、驱动
层面以及应用、中间件层面的开发。
常见的岗位有:嵌入式开发工程师、驱动开发工程师、系统开发工程师、Linux开发工程
师、固件开发工程师等。
知名的一些厂商,比如:以华为、vivo、oppo、小米为代表的手机厂;以紫光展锐、乐鑫为
代表的芯片厂;以大疆、海康威视、大华、CVTE等具有自己终端业务厂商;以及海尔、海
信、格力等传统家电行业。
随着5G的普及,物联网(即万物互联,)也成为了一种新兴势力,比如:阿里lot、腾讯lot、京
东、百度、美团等都有硬件相关的事业部。
- 数字图像处理
数字图像处理中涉及到大量数学矩阵方面的运算,对CPU算力要求比较高,主要的图像处理
算法库和开源库等都是C/C++写的,比如:OpenCV、OpenGL等,大名鼎鼎的Photoshop
就是C++写的。
- 人工智能
一提到人工智能,大家首先想到的就是python,认为学习人工智能就要学习python,这个
是误区,python中库比较丰富,使用python可以快速搭建神经网络、填入参数导入数据就
可以开始训练模型了。但人工智能背后深度学习算法等核心还是用C++写的。
- 分布式应用
近年来移动互联网的兴起,各应用数据量业务量不断攀升;后端架构要不断提高性能和并发
能力才能应对大信息时代的来临。在分布式领域,好些分布式框架、文件系统、中间组件等
都是C++开发的。对分布式计算影响极大的Hadoop生态的几个重量级组件:HDFS、
zookeeper、HBase等,也都是基于Google用C++实现的GFS、Chubby、BigTable。包括分
布式计算框架MapReduce也是Google先用C++实现了一套,之后才有开源的java版本。
除了上述领域外,在:科学计算、浏览器、流媒体开发、网络软件等都是C++比较适合的场景,
作为一名老牌语言的常青树,C++一直霸占编程语言前5名,肯定有其存在的价值。
说了这么多那么我们今天就来介绍一下 C++ 的学习都说C++是C语言的升级版毕竟都叫
Cplusplus
了没点本事怎么敢这样叫呢?
C++
第一个升级的地方就是命名空间的概念,以往我们在写C语言程序的时候的变量和函数都是大量存在的,而C++中还有类也是大量存在这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。
比如在 有俩个业务员去负责俩个模块但是他们去的函数名都一样在自己的机器上都运行的好好的一旦把自己的代码合并到主服务器上去就出现命名冲突的问题导致程序崩溃。
- 所以为了解决这个问题C++ 中就有了命名空间的概念,这也是我们要学的第一个关键字
namespace
以往我们在定义全局变量的时候如果和库函数语言了就会导致出现命名冲突的情况
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
// C语言没办法解决类似这样的命名冲突问题
// 所以C++提出了namespace来解决
int main()
{
printf("%d\n", rand);
return 0;
}
所以我们在C++ 可以使用
namespace
定义一个命名空间在这个命名空间里就相当于拿一个围栏来围起来这样在namespace
里面就相当于一个单独的空间了。
- 而我们在使用的时候只需要使用单独展开就可以使用了,相互之间并不冲突
命名空间的使用非常简单就直接使用关键字和命名空间名,就可以了。这这个空间里面我们可以定义变量函数,或者结构体等等是相当于一个单独的作用域。
- 命名空间相当于在全局作用域上开辟了一片新的领土所以他与全局范围的变量并不冲突
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
namespace gugu
{
int rand = 0;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
而我们想要使用命名空间就需要 域作用限定符
::
这个东西了,他可以让我们访问到命名空间的的内容
- 域作用限定符 左边事命名空间名
::
右边是要访问的内容
🍸 代码演示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
namespace gugu
{
int rand = 10;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
int main()
{
cout << gugu::rand << endl;
}
前面说域的可能很多老铁不太明白,其实域一共有这几种
域 |
---|
局部域 |
全局域 |
命名空间域 |
类域 |
而 域作用限定符
的 概念就是 从指定的域里面去访问,平常我们访问一个变量是优先 局部作用域去寻找的,然后再去全局范围进行寻找,但是用了 域作用限定符
就不一样:
- 它会从指定范围进行寻找
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
namespace gugu
{
int rand = 10;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
int main()
{
int rand = 20;
cout << gugu::rand << endl;
}
这里很多人肯定以为命名空间不能重名但是在C++中其实命名空间是可以重名的:
🍸 代码演示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
namespace gugu
{
int rand = 10;
}
namespace gugu
{
int x = 20;
}
int main()
{
int rand = 20;
cout << gugu::rand << endl;
}
📑 代码结果:
哦豁这里大家就可以看到命名空间是可以重命名的并且不报错,这里其实是编译器吧俩段代码进行合并了。
假设我们有俩个项目需要俩个人来进行写代码,但是他们所写的项目都属于一个命名空间里面的,这时候可以重名的优势就体现出来了,他们俩个一起写的代码都会合并到同一个命名空间。
虽然命名空间很好用但是有很多人说,这每次使用起来也太麻烦了吧,每一个函数都要加 域作用限定符
。别急其实命名空间还有一种用法就是展开使用:
像我们平时写代码和进行算法竞赛的时候其实只需要将命名空间展开就好了
using namespace std;
其中 std 是 std的所有C++库命名空间using
是使用这个命名空间的意思
🍸 代码演示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
int main()
{
int rand = 20;
cout << rand << endl;
}
把 using namespace std;
加上我们就可以使用全部的官方库了,但是这里要注意头文件是把代码合并过来,而展开命名空间是把这个块空间公开。
相当于是命名空间本身在全局域里面围了一块地当自己的命名空间域,现在把这块围起来的地围栏给打开了。
- 点赞
- 收藏
- 关注作者
评论(0)