这些日子,基本做完了硬件设计,有了时间审查软件代码,所以整理一些和C++有关的知识点。今天这个话题,总结C++本质方面的问题,C++到底是什么,为什么会定义出这么灵活又复杂的开发语言,知其然,还知其所以然。
1这是一位仁兄的总结,总结很好,可以看看:
C语言有两种概念:变量和函数,变量分栈变量和堆变量,前者又叫临时变量,就是在函数内部声明的变量,这种变量可以理解成当函数返回后就消失了,所以不用担心存储空间,但是另一方面,栈变量不能太多太大,因为栈空间本来就不大。
函数本质上是代码,函数的定义同时也是声明,而且唯一。这和变量是不同的,变量必须定义声明两个地方才会存在于内存中。函数存储于代码区,一般是只读的,但是不一定。函数和函数内部的变量完全存储于不同的地方。
函数参数就是函数的局部变量。
程序(以Win32为例),本质上一个虚拟空间,大小为2^32,这虚拟的,但是你可以当真的用,操作系统会自动处理你需要的空间。其他操作系统大致也是这个原理。
指针就是对象在这个虚拟空间中的偏移量。(那么多讲指针的教程,其实这一句理解了就够了,对象就是指函数和变量两种)。
C++就是在C语言的基础上,把函数和变量分组,叫做一个类,类的变量在内存中是按声明顺序排列的。
C++类的成员函数隐藏着一个this参数,本质上和C函数没有区别。你调用C++成员函数的时候,这this参数不是函数的第一个参数,而是类的对象指针+dot或->来调用。类的地址其实就是第一个变量的地址。
函数参数的引用调用本质上就是指针调用,区别只对于上层语法,底层代码没有区别。
C++类可以有构造和析构函数,这两个函数分别在生成对象和销毁对象时自动调用,这才是C++与C的真正区别,这一点,C语言无法模拟。
构造和析构函数调用顺序如下:构造,先进入构造函数,但是不执行语句,然后开始调用成员的构造函数,全部调用完成后(可能有很多嵌套),才开始执行构造函数内的语句。析构函数,先调用析构函数,并执行完全部语句,但是不返回,开始执行成员的析构函数,执行完成后函数返回。
虚函数,虚函数是一个独立的机制,它在类的内部保存一个指针,这个指针指向的内存是一个函数列表。如果继承类(子类)也声明了这个同名函数,列表里存在的函数会被替换,多重继承就会多次替换(当然是在编译时期就确定的),这样即使在父类中调用这个函数,调用的也是子类的函数。
多重继承,就是把两个父类的成员和函数都放到一个类里面。
虚继承,就是父类的父类如果是同一个类,虚继承不会重复父类的父类的成员,非虚继承则会重复(简单的复制父类的全部成员)。
32位系统下的函数指针本质上只需要32位,但是各种笨拙的C++语法,把这个东西弄的非常复杂混乱。特别是类的成员函数,本质上需要指明第一个参数和函数指针两个对象,才能确定,但是把这样一个概念非用函数指针的语法来表示,所以类的成员函数指针是个怪胎,能不用,就不用。(各种编译器实现也是不同的)。
模板,简单的说,就是给出函数或者类的一个模子,只有模板参数确定的时候,才能生成具体的代码,所以你不能把模板函数或类做到动态链接库中。虽然实际上你能这么做,但是这些函数和对象不在动态链接库中,而是在你编译的时候才生成。模板涉及到的数学概念比C++语言本身要复杂很多很多倍,无法一句话说清楚。但是我们常用的不是很多。
大体上就这么多了吧。这就是C++的全部核心本质。
2.C++产生的原因,说明了什么是C++
最初导致C++诞生的原因是在Bjarne博士等人试图去分析UNIX的内核的时候,这项工作开始于1979年4月,当时由于没有合适的工具能够有效的分析由于内核分布而造成的网络流量,以及怎样将内核模块化。同年10月,Bjarne博士完成了一个可以运行的预处理程序,称之为Cpre,它为C加上了类似Simula的类机制。在这个过程中,Bjarne博士开始思考是不是要开发一种新的语言,当时贝尔实验室对这个想法很感兴趣,就让Bjarne博士等人组成一个开发小组,专门进行研究。 当时不是叫做C++,而是C with class,这是把它当作一种C语言的有效扩充。由于当时C语言在编程界居于老大的地位,要想发展一种新的语言,最强大的竞争对手就是C语言,所以当时有两个问题最受关注:C++要在运行时间、代码紧凑性和数据紧凑性方面能够与C语言相媲美,但是还要尽量避免在语言应用领域的限制。在这种情况下,一个很自然的想法就是让C++从C语言继承过来,但是我们的Bjarne博士更具有先见之明,他为了避免受到C语言的局限性,参考了很多的语言,例如:从Simula继承了类的概念,从Algol68继承了运算符重载、引用以及在任何地方声明变量的能力,从BCPL获得了//注释,从Ada得到了模板、名字空间,从Ada、Clu和ML取来了异常。
有了这些简单的总结,其实可以大体了解C++本质,使用C不能很好解决问题时,利用C语言扩展了一一种新的语言,这就演变成了今天的C++。