前言
拖了这么久终于开始更传说中的C++了,虽然可能听说C++是掌控一切的,很难,但是认真学还是能学好的。未来改变世界的能力就交给各位了。
本系列文章默认已经学过C语言,并且对数据结构的一小部分知识有简单了解,(只要看过前面的专栏绝对够了)建议在正式开启学习C++之前,可以复习一下C语言相关的知识。
1.认识C++
C语言是结构化、模块化的语言,适合处理较小规模的程序。对于复杂和规模较大的程序,需要高度的抽象和建模时,C语言就太不合适了。C语言是面向过程的程序设计语言。
为了解决软件危机,20世纪80年代,计算机提出了 OOP(Object Oriented Programming),即面向对象思想,支持面向对象的程序设计语言C++就应运而生了。C++是由C语言发展而来的,所以C++兼容C语言,C++ 在西方称为C Puls Puls(CPP)
下图是C++之父---本贾尼
1979年,贝尔实验室的本贾尼等人在试图分析 Unix 内核的时候,试图将内核模块化,于是在C语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为 C with classes。后面在C++的发展中发展到了很多的阶段。下面在1998年定的标注,这个版本之后的 C++ 就相对比较完善了。支持了泛型编程,引入了STL标准模板库。 目前下面阶段重要的是C++98和C++11。
之后C++的更新其实是有点慢的, 比如 C++03 和 C++05 主要是修订一些东西。直到 C++11 才开始新增了新的东西,在这之后 14 17 也是在修订……如今出了 C++20,也是一个备受吐槽的版本,因为没有加啥特性。所以这里主要讲的是C++98和C++11。
2.C++的重要性
C++ 到现在为止已经将近有40年了,目前最主流的两门语言 C/C++ 和 Java,其次就是 Python了,近几年机器学习的算法,上层是用 Python 写的,再其次就是 Go,也是蛮火的。
C# 当年是微软搞出来为了对抗 Java 的语言,C#最大的限制就是他是 Windows 上的,发展路径可能不好。
从语言发展的角度来说,C++是主流语言。再说,学完C++上手其他语言也是非常快的。服务端开发、大型软件、游戏开发……其中游戏开发里很多用的也都是C++。
3.如何学习C++
多敲代码,多总结。记笔记、画思维导图。
常看书:
入门推荐看:高质量程序设计指南————C++/C语言
进阶推荐看: EffectiveC++ C++Primer
看看别人是怎么学的,以及掌握C++的各个阶段:
以下引用自2010年8月号《程序员》刊登的拙文《C++强大背后》最后一段:
C++缺点之一,是相对许多语言复杂,而且难学难精。
许多人说学习C语言只需一本K&R《C程序设计语言》 即可,但C++书籍却是多不胜数。我是从C进入C++,皆是靠阅读自学。在此分享一点学习心得。个人认为, 学习C++可分为4个层次:
第一个层次,C++基础 (平平常常)
挑选一本入门书籍,如《C++ Primer》、《C++大学教程》或Stroustrup撰写的经典《C++程序设计语 言》或他一年半前的新作《C++程序设计原理与实践》,而一般C++课程也止于此,另外《C++ 标准程 序库》及《The C++ Standard Library Extensions》可供参考;
第二个层次,正确高效的使用C++ (驾轻就熟)
此层次开始必须自修,阅读过《(More)Effective C++》、《(More)Exceptional C++》、 《Effective STL》及《C++编程规范》等,才适宜踏入专业C++开发之路;
第三个层次,深入解读C++ (出神入化)
关于全局问题可读《深入探索C++对象模型》、《Imperfect C++》、《C++沉思录》、《STL源码剖析》,要挑战智商,可看关于模版及模版元编程的书籍如《C++ Templates》、《C++设计新思维》、 《C++模版元编程》;
第四个层次,研究C++ (返璞归真)
阅读《C++语言的设计和演化》、《编程的本质》(含STL设计背后的数学根基)、C++标准文件 《ISO/IEC 14882:2003》、C++标准委员会的提案书和报告书、关于C++的学术文献。
建议不要把「精通C++」作为一个一年目标,应该要把学习语言作为一个持续的过程,同时要把语言运用在具体的应用场合中。
4.编写Hello World!
新生婴儿会以自己独特的方式向这个崭新的世界打招呼,C++刚出来后,也算是一个新事物,
那C++是否也应该向这个美好的世界来声问候呢?来看下C++是如何来实现问候的。
打开编译器创建完新项目后,右键源文件,点击 "添加新建项" 。
以前取得是Test.c现在名称我们就取为 Test.cpp,这样代码就能很好地创建出来了:
#include <iostream> using namespace std; int main() { cout << "Hello World!" << endl; return 0; }
以上iostream是c++输入输出流的头文件,和C语言的stdio.h类似
using namespace std;是展开std的命名空间
cout 与printf 类似 ,<< 是流输出运算符, endl是换行
和刚学C语言一样,写C++也应该先把框架敲出来,下面详细介绍框架内容。
5.关键字
C++ 标准共计有 63 个关键字 (C++11),其中包括 C 语言的 32 个关键字。
这里不对关键字进行具体的讲解,后续都慢慢会学到的
目前只需要注意一点:命名时要避开这些关键字。
如果把变量命名为关键字,编译器将无法识别这个标识符。从而导致编译错误。
注意下面这些关键字,对于刚学完 C 的初学者来说有很多 "生词" ,先混个眼熟:
这里把关键字表列出来,是为了在初学 C++ 时少踩命名的坑。
6.命名空间(namespace)
在 C/C++ 中,变量、函数和类都是大量存在的,这些变量、函数和类的名称,
都会存在于全局作用域中,这么一来就会导致 命名冲突 问题……
C++ 引入了 namespace,只要合理使用,就可以有效地避免命名冲突问题。
使用命名空间的目的:对标识符的名称进行本地化,以避免命名冲突或名字污染。
刚才 Hello World ! 代码中的 namespace 的出现,就是针对这个问题的。
比如在 stdlib 库中有一个生成随机数的函数 rand() ,
相信大家都认识,但是假装某个人不知道 stdlib 库中有一个叫 rand 的函数存在,
因此在定义变量时给变量取名为 rand 。
#include<stdio.h> #include<stdlib.h> int rand = 525; int main() { printf("%d\n", rand);// 这里到底是打印我们自己定义的rand,还是stdlib里的? return 0; }
我们知道,#include 包含头文件,头文件里的内容是会被展开来的。
当展开头文件时,stdlib 库中有一个叫 rand 的函数,我这里又定义了一个叫 rand 的变量,
此时就冲突了,那么问题来了,这里 printf 打印出来的会是什么呢?
编译器的寻找规则: 局部找 → 全局找 → 找不到(报错)。
问题是在C语言里几乎没有办法很好地解决这种问题。
所以为了很好地解决这种冲突的问题,C++ 就加入了命名空间的特性。
在 C++ 里,我们就可以利用 "命名空间" 来解决这个问题,
所以 C++ 提出了一个新语法 —— 命名空间 namespace。
6.1命名空间的定义
定义命名空间,肯定得用到我们刚才提到的 namespace 关键字,
namespace 后面可以取一个空间名,然后再接上一对大括号就可以了
我们该如何使用它呢?修改上面的代码:
#include<stdio.h> #include<stdlib.h> namespace rtx // 自己定义的命名空间可以自己随意命名 { int rand = 525; } int main() { printf("%d\n", rtx::rand);//这样就能打印我们定义的rand了 return 0; }
这里的 : : 叫做 "作用域限定符" 。这么一来,就不怕冲突了,问题就这么轻松地解决了。
命名空间能够达到一种类似于 "隔离" 的效果。
注意事项:①命名空间必须在全局作用域下定义。其次,正是因为命名空间是全局的,所以这个 rand 变量也自然而然地变成了全局变量。
②命名空间长得有点像结构体,但是它和结构体不是一个东西,结构体是定义一个类型,它们的性质是完全不一样的。还有,命名空间大括号外不用加分号。
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)(下):https://developer.aliyun.com/article/1513633?spm=a2c6h.13148508.setting.24.5e0d4f0emCh6wU