即使走的再远,也勿忘启程时的初心
C/C++ 游戏开发
Hello,米娜桑们,这里是君兮_,数据结构和算法初阶更新完毕,我们继续来扩充我们的知识面,今天我们从认识C++开始来带大家学习C++,我之前看过一套书叫做《明朝那些事儿》,把本来枯燥的历史讲的生动有趣。而C++作为一门接近底层的语言,无疑是抽象且难度颇深的。我希望能努力把抽象繁多的知识讲的生动又通俗易懂,因此,咱们这个讲解C++的系列博客就叫做《C++那些事儿》啦
- 好了废话不多说,开始我们今天的学习吧!!
C++那些事儿
- 先导:什么是C++?
- C++在工作领域中的应用
- 怎样学习C++呢?
- 一.命名空间
- 什么是命名空间
- 命名空间的定义
- 命名空间的使用
- 命名空间的三种使用方式
- 二. C++中的输入和输出
- 三.缺省函数
- 缺省函数的分类
- 总结
先导:什么是C++?
说到C++,我们很多人都听过它的顶顶大名,C++也常年霸占着市面上程序员使用的编程语言前五的位置,足以说明它的重要性和被认可度,那么说到底,什么是C++呢?
-
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的
程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机
界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言
应运而生。
-
1982年,Bjarne Stroustrup博士(C++祖师爷)在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计
说到底,就是咱们的祖师爷在自己使用C语言的时候,发现了许多C语言的不足和缺陷,这让祖师爷在用的时候非常的不爽,因此自己着手在C语言的基础上又开发了一门新的语言C++,他的语言他做主,他就在自己的语言中补足了C的缺陷和那些在使用时让人不爽的地方,C++应运而生,后来在经过不断的发展递进,不段引入新的标准和特性,就到了目前我们电脑中的C++啦!
C++在工作领域中的应用
- 1. 操作系统以及大型系统软件开发
所有操作系统几乎都是C/C++写的,许多大型软件背后几乎都是C++写的,比如:
Photoshop、Office、JVM(Java虚拟机)等,究其原因还是性能高,可以直接操控硬件。 - 2. 服务器端开发
后台开发:主要侧重于业务逻辑的处理,即对于前端请求后端给出对应的响应,现在主流采
用java,但内卷化比较严重,大厂可能会有C++后台开发,主要做一些基础组件,中间件、
缓存、分布式存储等。服务器端开发比后台开发跟广泛,包含后台开发,一般对实时性要求
比较高的,比如游戏服务器、流媒体服务器、网络通讯等都采用C++开发的。 - 3. 游戏开发
PC平台几乎所有的游戏都是C++写的,比如:魔兽世界、传奇、CS、跑跑卡丁车等,市面上
相当多的游戏引擎都是基于C++开发的,比如:Cocos2d、虚幻4、DirectX等。三维游戏领
域计算量非常庞大,底层的数学全都是矩阵变换,想要画面精美、内容丰富、游戏实时性
搞,这些高难度需求无疑只能选C++语言。比较知名厂商:腾讯、网易、完美世界、巨人网
络等。 - 4. 嵌入式和物联网领域
嵌入式:就是把具有计算能力的主控板嵌入到机器装置或者电子装置的内部,能够控制这些
装置。比如:智能手环、摄像头、扫地机器人、智能音响等。
谈到嵌入式开发,大家最能想到的就是单片机开发(即在8位、16位或者32位单片机产品或者
裸机上进行的开发),嵌入式开发除了单片机开发以外,还包含在soc片上、系统层面、驱动
层面以及应用、中间件层面的开发。
常见的岗位有:嵌入式开发工程师、驱动开发工程师、系统开发工程师、Linux开发工程
师、固件开发工程师等。
知名的一些厂商,比如:以华为、vivo、oppo、小米为代表的手机厂;以紫光展锐、乐鑫为
代表的芯片厂;以大疆、海康威视、大华、CVTE等具有自己终端业务厂商;以及海尔、海
信、格力等传统家电行业。
随着5G的普及,物联网(即万物互联,)也成为了一种新兴势力,比如:阿里lot、腾讯lot、京
东、百度、美团等都有硬件相关的事业部。 - 5. 数字图像处理
数字图像处理中涉及到大量数学矩阵方面的运算,对CPU算力要求比较高,主要的图像处理
算法库和开源库等都是C/C++写的,比如:OpenCV、OpenGL等,大名鼎鼎的Photoshop
就是C++写的。 - 6. 人工智能
一提到人工智能,大家首先想到的就是python,认为学习人工智能就要学习python,这个
是误区,python中库比较丰富,使用python可以快速搭建神经网络、填入参数导入数据就
可以开始训练模型了。但人工智能背后深度学习算法等核心还是用C++写的。 - 7. 分布式应用
近年来移动互联网的兴起,各应用数据量业务量不断攀升;后端架构要不断提高性能和并发
能力才能应对大信息时代的来临。在分布式领域,好些分布式框架、文件系统、中间组件等
都是C++开发的。对分布式计算影响极大的Hadoop生态的几个重量级组件:HDFS、
zookeeper、HBase等,也都是基于Google用C++实现的GFS、Chubby、BigTable。包括分
布式计算框架MapReduce也是Google先用C++实现了一套,之后才有开源的java版本。
除了上述领域外,科学计算、浏览器、流媒体开发、网络软件等都是C++比较适合的场景,
作为一名老牌语言的常青树,C++一直霸占编程语言前5名,肯定有其存在的价值
怎样学习C++呢?
- 这里有一套21天精通C++的秘籍供大家参考:
- C++缺点之一,是相对许多语言复杂,而且难学难精。因此想要在短暂的时间说精通它是基本不可能的,甚至说,目前敢自称精通C++的大佬,估计除了那些开发编译器和新语言的,少之又少。
- 因此,在这里,我给大家的建议是不要把「精通C++」作为一个一年目标,应该要把学习语言作为一个持续的过程,同时把语言运用在具体的应用场合中,你想做到任何有挑战的事物,持之以恒是你最好的选择!!
好了,讲了这么多有关对C++的内容,不知道你是否准备好正式开始进入C++的学习呢?无论你准备没准备好,别想那么多,现在, Just Do it,不做你就不可能有进步,深吸一口气,开始我们正式的C++学习吧!!
一.命名空间
- 不知道你是否遇到这种情况,当你在使用C语言的过程中,定义一个函数或变量时,编辑器提示你该函数或变量已存在
- 在C语言中,是无法解决这样的命名问题的,而为了解决命名冲突的问题,C++中提出了命名空间的概念
什么是命名空间
- 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存
在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,
以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的
命名空间的定义
- 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}
中即为命名空间的成员。
#include<iostream>
namespace junxi
{
int rand = 10;
}
int main()
{
printf("%d\n", rand);//在这里这是错误的用法,别急,在使用命名空间是会讲
return 0;
}
在以后的工作和项目开发中,往往是多人协作的,为了防止和别的命名空间冲突,这里的命名空间建议写成自己的名字的缩写,当然其他的也行,你自己认得出来就没啥问题。
- 在定义的命名空间中,除了变量以外,还可以定义函数,结构体等等,
此外,命名空间是支持嵌套的,也就是允许在命名空间中在定义一个命名空间。
最后,在同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中,在实际的开发中,这种方法不常用就是了。
namespace junxi
{
int rand = 10;
int Add(int x, int y)
{
return x + y;
}
namespace Junxi//嵌套
{
}
struct Node
{
struct Node* next;
int val;
};
}
//同一工程中相同的命名空间最后会合并
namespace junxi
{
int a = 0;
int b = 0;
}
int main()
{
printf("%d\n", rand);
return 0;
}
- 注意:
- 1.千万不要把主函数写在一个命名空间中,我们知道,每一个工程中都需要一个主函数,如果你把主函数写在一个命名空间中又不使用它,这个工程中就是没有主函数的!!
- 2.一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
命名空间的使用
- 回顾我们刚才的这段代码,我在上面说了,在打印rand的时候是有错误的
- 当我们打印时,会出现随机数,这是为什么呢?
- 因为rand在命名空间中,我们要想使用一个命名空间中的成员就得像下面这样:
命名空间的三种使用方式
- 1.加命名空间名称及作用域限定符
int main()
{
printf("%d\n", junxi::rand);
return 0;
}
- 2.使用using将命名空间中某个成员引入
using junxi::a;
int main()
{
printf("%d\n", a);
return 0;
}
- 3.使用using namespace 命名空间名称引入
using namespace junxi;
int main()
{
printf("%d\n", a);
return 0;
}
- 如果你仔细观察会发现,我这里2,3这两种命名空间的使用时没有打印rand,这是为什么呢?
- 注意:
- 并不是说在C++中就完全解决了C语言中函数重定义的问题,当我们遇到以下情况时,仍然会报错:
- 第一种情况
namespace junxi
{
int rand = 10;
int Add(int x, int y)
{
return x + y;
}
namespace Junxi
{
}
struct Node
{
struct Node* next;
int val;
};
}
using junxi::rand;
int main()
{
printf("%d\n", rand);
return 0;
}
- 第二种情况
using namespace junxi;
int main()
{
printf("%d\n", rand);
return 0;
}
- 此时,你虽然引用了命名空间或者指出了对应命名空间中的成员,但是由于库中存在rand这个函数,你在打印时没有明确指出到底是哪个是要打印的,编译器就无法编译不明确的代码,因此,如果你在实际编程开发中遇到上面这种情况,建议使用第一种使用命名空间成员的办法!!
二. C++中的输入和输出
- 我们很多人学习编程语言的一个输入往往是“hello world”,那么,我们怎样用C++对这个美好的世界进行问候呢?
#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中(类似于我们C语言中的stdio)
using namespace std;
int main()
{
cout<<"Hello world!!!"<<endl;//输出
return 0;
}
- 具体说明
- 1. 使用 cout标准输出对象(控制台) 和 cin标准输入对象(键盘) 时,必须包含< iostream >头文件
以及按命名空间使用方法使用std。 - 2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<
iostream >头文件中。 - 3. <<是流插入运算符,>>是流提取运算符。
- 4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型
#include <iostream>
using namespace std;
int main()
{
int a;
double b;
char c;
// 可以自动识别变量的类型
cin >> a;
cin >> b >> c;//输入数回车结束 先输入到b中,再输入到c中
cout << a << endl;
cout << b << " " << c << endl;//从左到右打印
return 0;
}
- 这里这么多<< 和 >>很多初学的同学可能会分不清,那么我教大家一个能快速记住的小寄巧
- <<流插入运算符,你把它当作水流,也就是把你要输入的内容流入cout,cout就帮你把里面的内容输出到控制台上,也就是打印啦!
- >>流提取运算符,cin从键盘上读取到数据后,流出>>到你想要它到的地方,是不是就是输入啦!
- 也就是说,看这俩运算符的指向,就能很轻易的帮我们分辨出到底是输入还是输出
- 很多人,看到这里可能会有这样的疑问,那在日常使用时,怎样用cout和cin控制整形进制格式或者浮点数输出精度呢?
cout和cin当然可以帮我们达到这样的目标,对应初学者来说,使用cout和cin控制输入输出是比较麻烦的,因此,我们就不在这里展开学习了。如果你真的在使用过程中遇到类似的需要,别忘了C++是兼容C的哦!我们可以用C的方法实现嘛
三.缺省函数
- 什么是缺省函数呢?
- 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实
参则采用该形参的缺省值,否则使用指定的实参
void Func(int a = 0)
{
cout << a << endl;
}
int main()
{
Func(); // 没有传参时,使用参数的默认值
Func(10); // 传参时,使用指定的实参
return 0;
}
缺省函数的分类
- 上面的例子,我们的函数只有一个传入的参数,当传入多个参数时,我们的缺省函数就存在不同的种类了
- 全缺省函数
void Func(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
-
即每一个传入的参数都有一个缺省值的函数,我们视为全缺省函数
-
半缺省函数
void Func(int a, int b = 10, int c = 20)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
注意:
1. 半缺省参数必须从右往左依次来给出,不能间隔着给
2. 缺省参数不能在函数声明和定义中同时出现,往往是出现在声明中
3. 缺省值必须是常量或者全局变量
4. C语言不支持缺省函数(编译器不支持)
- 下面我来对上述的前两点注意进行一下解释
- 第一点 为什么必须从左到右不能间隔给呢?
void Func(int c, int a = 0, int d )
{
cout << c << endl;
cout << a << endl;
cout << d << endl;
}
int main()
{
Func(10); // 传参时,使用指定的实参
return 0;
}
- 如果出现上面这种情况,我们只传入了一个参数,那么,请问,这个参数到底是赋给c还是赋给d呢?只有你知道,而咱们的编译器是不知道的,因此必须按顺序设置缺省参数的值
- 第二点,为什么不能在函数的声明和定义中同时出现?
//a.h 在头文件中
void Func(int a = 10);
// a.cpp //具体实现时的定义
void Func(int a = 20)
{}
- 如果出现以上的情况,当声明与定义你给的缺省参数是不同的,那么编译器在运行程序时到底是以谁为准呢?同时,正常来说,也不能只在定义中给,因为如果你在使用某个函数时只引用了它对应的头文件,在声明中是不存在缺省参数的,你实际在使用该函数时就是没有缺省参数的。因此,在我们的日常使用中,最好是在声明中使用缺省函数。
总结
-
好啦,我们今天的内容就先到这里啦!今天我们主要介绍了C++中命名空间,输入输出和缺省函数的概念使用以及注意事项,俗话说心急吃不了热豆腐,正如我前面所说,学习C++不是一朝一夕的事情,只有不断的积累和反复的练习才能帮你攀上C++这座高峰。
-
有任何的问题和对文章内容的疑惑欢迎在评论区中提出,当然也可以私信我,我会在第一时间回复的!!
新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下再走呗。你们的支持就是我更新的动力!!!
**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**