现在我们讲完了数据结构初阶部分的内容,数据结构剩下的内容会在C++语言讲解的差不多的时候加入。
1. 什么是C++
C语言是结构化模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了OPP(object oriented programming:面对对象)思想,支持面向对象的程序设计语言应运而生。
1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩大了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此,C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。
可能我们还见过C#语言,值得注意的是这个根C/C++没有关系,它是微软公司搞出来对抗Java语言的,所以它对标的是Java。
2. C++的发展史
1979年,贝尔实验室的本贾尼等人试图分析unix内核的时候,试图将内核模块化,于是在C语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为 C with classes
C++不断发展的道路上出现了众多的版本,目前最新的版本发展到了 C++23 ,但是目前主流的版本还是C++98和C++11,所以大家也不用一味的追求最新
3. 命名空间
在C/C++中变量、函数和后面学到的类都是大量存在的,这些变量、函数、和类的名称将都存在于全局作用域中,可能会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字的污染,namespace关键字的出现就是针对这类型的问题的
比如我们现在定义一个全局变量rand,并打印它,目前程序没有任何问题
此时我们引入stdlib.h头文件,现在rand变量和rand()函数发生了冲突,程序报错,其原因就是出现了命名冲突的问题
那么C++中的命名空间就可以很好的解决这一问题,在此之前我们先说一个操作符
我们直到在同时定义了全局变量和局部变量的时候,程序会使用局部变量,那么此时如果我们还是想用全局变量的时候就要用到域作用限定符 :: ,当域作用限定符前面为空时默认是访问全局域
那么在使用命名空间的时候我们也可以用这一方法避免变量名的冲突:
当我们使用一个变量、函数时编译器默认的查找顺序是:先在当前局部域找,再到全局域找,值得注意的是默认情况下不会去命名空间去找。可以说如果我们用了域作用限定符,那么就会直接到对应命名空间查找,如果不用就不会访问命名空间
命名空间中除了可以定义变量还可以定义函数和类型,这样可以避免和全局域,或者他人的命名空间的内容冲突
同时命名空间还可以嵌套:
值得注意的是结构体类型在使用的时候命名空间的名称写在struct之后
在同一项目的不同文件中可以使用同名的命名空间,若如此做,编译器会自动将几个文件的相同命名空间合并