批量生成程序员--C++入门基础--那些你不可错过的C++教程
文章目录
- C++教程大纲
- C++发展历史
- C++版本更新
- C++学习的一些参考文档
- C++的应用领域
- C++学习书籍推荐
- 一、第一个C++程序
- 二、C语言的不足、C++的改进
- 2.1命名冲突
- 2.2命名空间
- 2.3命名空间的定义
- 2.4命名空间的使用
- 2.4.1命名空间展开和头文件展开的区别
- 三、C++的输入、输出详解
- 四、缺省参数(缺省值、默认值)
- 五:函数重载
- 六、引用
- 七、结语
C++教程大纲
教程内容:C++语法,STL,高阶数据结构
C++发展历史
1983年,Bjarne Stroustrup在C语⾔的基础上添加了⾯向对象编程的特性,设计出了C++语⾔的雏形,此时的C++已经有了类、封装、继承等核⼼概念,为后来的⾯向对象编程奠定了基础。这⼀年该语⾔被正式命名为C++。
C++版本更新
C++的初代标准发布于1998年简称C++98,之后的一个版本直到2003年才发布,称为C++03,后续的命名沿用C++0x,C++xx。其中的几个有较大更新的版本时C++98、C++11、C++20.
C++学习的一些参考文档
本文给出一些C++学习过程中会用到的参考文档,包含标准库,语法等的代码和用法。
- https://legacy.cplusplus.com/reference/
- https://zh.cppreference.com/w/cpp
- https://en.cppreference.com/w/
C++的应用领域
C++的应⽤领域服务器端、游戏(引擎)、机器学习引擎、⾳视频处理、嵌⼊式软件、电信设备、⾦融应⽤、基础库、操作系统、编译器、基础架构、基础⼯具、硬件交互等很多⽅⾯都有。
- 大型系统软件开发。如编译器、数据库、操作系统、浏览器等等
- 音视频播放器开发,比如B站
- PC客户端开发,图形化界面
- 服务端开发,游戏服务器,融媒体服务,量化高频交易等对性能要求高的服务
- 游戏引擎的开发,很多游戏的引擎的开发都依赖于C++,游戏开发需要掌握C++基础和数据结构,学习图形学知识,掌握游戏引擎和框架,了解引擎实现,引擎源代码可以学习UE4,Cocos2d-x等开源引擎的实现
- 嵌入式开发,C++的高性能在嵌入式领域具有优势,嵌入式把具有计算能力的主控板嵌入到机器装置或者电子装置的内部,通过软件能够控制这些装置。比如:电子手环、摄像头、扫地机器人等、智能影响、门禁系统、车载系统等等、粗略一点,嵌入式开发主要分为嵌入式应用和嵌入式驱动开发
- 机器学习引擎(不大推荐,可以胜任大概67分),机器学习的底层语言是C++,上层用python封装起来,如果只是想要准备数据训练模型,那么只需要掌握python就好了,如果是想要做机器学习系统的开发,那么需要掌握C++
- 测试开发/纯测试领域,每个公司都有研发团队,有研发就必然有测试,通过测试才能上线投入应用,测试主要分为测试开发和功能测试
C++学习书籍推荐
- 语法字典:C++ primer
- 高效C++:这本书非常好,C++基础学习得差不多的时候可以看,工作一两年也可以看
- STL源码分析:C++学习的中后期看
一、第一个C++程序
#include<stdio.h>intmain(){printf("hello world\n");return0;}这时候就有老铁要问了,主播主播你的C++程序为什么一股子C味啊,是的,那是因为C++就是在C的基础上改进而来的,所以C++兼容C的语法,C语言的那套我们放在C++同样适用,但是高不高效就是另外一回事了,改进了那些地方后面的教程都会介绍。
在C++我们有自己的打印语法,需要用到输出流
#include<iostream>usingnamespacestd;intmain(){cout<<"hello world"<<endl;return0;}cout是ostream类的一个全局对象,标准输出流适用于窄字符,用于控制台输出,能够自动识别要输出的类型。
相比C语言的优势,不用手动设置输出类型的格式。
<<是流插入运算符,和C语言的左移操作符是一样的,操作符重载
endl是一种换行符,和"\n"作用效果相同,endl是一个函数
二、C语言的不足、C++的改进
2.1命名冲突
C语言中不能允许同一个作用域中有同名变量、函数等的定义
有时候我们代码写完原本好好的,没有编译报错,结果一包上一个头文件,出现了重定义的报错,这就非常的抓马了
2.2命名空间
为了解决命名冲突等等问题,C++创新了命名空间这一工具
命名空间的价值:在C/C++中,变量、函数名和后面会遇到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或者名字污染,namespace关键字的出现就是针对这种问题的。
2.3命名空间的定义
- 定义一个命名空间需要用到namespace关键字,后面跟命名空间的名字,然后接一对**{}**即可,注意不需要加分号;,{}所括住的就是命名空间中的成员,命名空间中可以定义变量函数和类型等,非常方便
- namespace本质是定义出了一个域,这个域和全局域独立,不同的域可以定义同名变量,不会产生命名冲突
- C++中的域有局部域、全局域、命名空间域、类域、;域影响的是编译时,系统从何处查找一个变量/函数/类型出处的逻辑,有了域的隔离,编译器在查找时就不会遇到名字冲突的问题。局部域和全局域会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量的生命周期。
- 注意namespace命名空间只能定义在全局域,不过它时可以嵌套的定义的,就是一个命名空间中还可以定义别的不同名的命名空间
- 同一个工程下的不同文件或者同一文件不同位置定义的同名命名空间会自动合并,不会彼此冲突。
- C++标准库是放在一个叫std(standard)的命名空间里的
tips
命名空间不能定义在局部,只能定义在全局(不能定义在main函数中)
要访问命名空间的变量需要访问限定符需要用访问限定符,访问限定符::,就像你开门回家需要家们钥匙,开电脑需要解锁一样,访问限定符可以看作访问特定域的"钥匙",对哪个域使用,就能调用域空间里面的东西
命名空间只对名字做空间隔离不影响生命周期,就像水果店的水果虽然用不同的篮子装,做了空间上的隔离,但是却不会影响它们能存放的时间(生命周期)
同个命名空间可以定义在多个文件,自动合并
命名空间可以嵌套定义,调用时要层层访问先从最外层开始,直到你要调用的命名空间
2.4命名空间的使用
命名空间的使用方法:
编译器在编译查找一个变量的时候默认是先局部域再全局域,不会到命名空间域里面查找,所以我们要用访问限定符指定它去哪个域里面查找,如果访问限定符前面什么都没有跟就默认是全局域。
2.4.1命名空间展开和头文件展开的区别
头文件:相当于把头文件拷贝到当前文件内
命名空间:展开后就是没有墙的限制了,相当于在全局域,可以直接到全局域中访问
三、C++的输入、输出详解
- 是input output stream的缩写,是标准的输入、输出流库,定义了标准的输入、输出对象。
- std::cin是istream类的一个对象,它主要面向窄字符的标准输入流。
- std::out是ostream类的一个对象,它主要面向窄字符的标准输出流。
- std::endl是一个函数,流插入输出时,相当于一个换行字符加刷新缓冲区
- <<是流插入运算符,>>是流提取运算符。
- C++的输入输出更加方便,因为它会自动识别类型格式,不要像C语言那样手动设置指定的格式,C++的流能更好的支持自定义类型的输入输出。
四、缺省参数(缺省值、默认值)
1. 全缺省(全部给满默认值)
2. 半缺省(只给一部分缺省值,规定只能从左往右设缺省值,不能间隔
tips:缺省参数在声明和定义中不能同时给,且只能在函数声明的参数列表给。
五:函数重载
函数重载简单来说就是函数名相同,同名函数
构成函数重载的几种情况:
1. 函数名相同,但是参数类型不同
2. 参数个数不同
3. 参数顺序不同,实际上也是参数类型不同(对应位置上)
- 无参函数和全缺省函数在无参调用时可能产生调用歧义。
- 同一作用域,同名函数才能构成函数重载
- 返回值不可构成函数重载,函数重载只能通过参数构成,调用时无法区分
六、引用
引用实际上是给变量取别名,它的底层是指针
七、结语
这个系列名叫《批量生成程序员–那些你不可错过的C++教程》,虽然名字起的很酷,目标也很理想化,但是作为一种输出的方式,我希望我的博客能带给初学者一些启发,站在初学者的角度写下这个系列的第一篇文章,深感幸福。希望自己能坚持下去,代码之路很难也很累,累到有时候兴趣也被消磨殆尽还要咬牙坚持,笔者是一个很懒的人,希望能通过这种方式激发自己的斗志,任何的建议和意见,欢迎一同交流,我们共同进步!
