C语言有两种概念:变量和函数,变量分栈变量和堆变量,前者又叫临时变量,就是在函数内部声明的变量,这种变量可以理解成当函数返回后就消失了,所以不用担心存储空间,但是另一方面,栈变量不能太多太大,因为栈空间本来就不大。
函数本质上是代码,函数的定义同时也是声明,而且唯一。这和变量是不同的,变量必须定义声明两个地方才会存在于内存中。函数存储于代码区,一般是只读的,但是不一定。函数和函数内部的变量完全存储于不同的地方。
函数参数就是函数的局部变量。
程序(以Win32为例),本质上一个虚拟空间,大小为2^32,这虚拟的,但是你可以当真的用,操作系统会自动处理你需要的空间。其他操作系统大致也是这个原理。
指针就是对象在这个虚拟空间中的偏移量。(那么多讲指针的教程,其实这一句理解了就够了,对象就是指函数和变量两种)。
C++就是在C语言的基础上,把函数和变量分组,叫做一个类,类的变量在内存中是按声明顺序排列的。
C++类的成员函数隐藏着一个this参数,本质上和C函数没有区别。你调用C++成员函数的时候,这this参数不是函数的第一个参数,而是类的对象指针+dot或->来调用。类的地址其实就是第一个变量的地址。
函数参数的引用调用本质上就是指针调用,区别只对于上层语法,底层代码没有区别。
C++类可以有构造和析构函数,这两个函数分别在生成对象和销毁对象时自动调用,这才是C++与C的真正区别,这一点,C语言无法模拟。
构造和析构函数调用顺序如下:构造,先进入构造函数,但是不执行语句,然后开始调用成员的构造函数,全部调用完成后(可能有很多嵌套),才开始执行构造函数内的语句。析构函数,先调用析构函数,并执行完全部语句,但是不返回,开始执行成员的析构函数,执行完成后函数返回。
虚函数,虚函数是一个独立的机制,它在类的内部保存一个指针,这个指针指向的内存是一个函数列表。如果继承类(子类)也声明了这个同名函数,列表里存在的函数会被替换,多重继承就会多次替换(当然是在编译时期就确定的),这样即使在父类中调用这个函数,调用的也是子类的函数。
多重继承,就是把两个父类的成员和函数都放到一个类里面。
虚继承,就是父类的父类如果是同一个类,虚继承不会重复父类的父类的成员,非虚继承则会重复(简单的复制父类的全部成员)。
32位系统下的函数指针本质上只需要32位,但是各种笨拙的C++语法,把这个东西弄的非常复杂混乱。特别是类的成员函数,本质上需要指明第一个参数和函数指针两个对象,才能确定,但是把这样一个概念非用函数指针的语法来表示,所以类的成员函数指针是个怪胎,能不用,就不用。(各种编译器实现也是不同的)。
模板,简单的说,就是给出函数或者类的一个模子,只有模板参数确定的时候,才能生成具体的代码,所以你不能把模板函数或类做到动态链接库中。虽然实际上你能这么做,但是这些函数和对象不在动态链接库中,而是在你编译的时候才生成。模板涉及到的数学概念比C++语言本身要复杂很多很多倍,无法一句话说清楚。但是我们常用的不是很多。
大体上就这么多了吧。这就是C++的全部核心本质。
函数本质上是代码,函数的定义同时也是声明,而且唯一。这和变量是不同的,变量必须定义声明两个地方才会存在于内存中。函数存储于代码区,一般是只读的,但是不一定。函数和函数内部的变量完全存储于不同的地方。
函数参数就是函数的局部变量。
程序(以Win32为例),本质上一个虚拟空间,大小为2^32,这虚拟的,但是你可以当真的用,操作系统会自动处理你需要的空间。其他操作系统大致也是这个原理。
指针就是对象在这个虚拟空间中的偏移量。(那么多讲指针的教程,其实这一句理解了就够了,对象就是指函数和变量两种)。
C++就是在C语言的基础上,把函数和变量分组,叫做一个类,类的变量在内存中是按声明顺序排列的。
C++类的成员函数隐藏着一个this参数,本质上和C函数没有区别。你调用C++成员函数的时候,这this参数不是函数的第一个参数,而是类的对象指针+dot或->来调用。类的地址其实就是第一个变量的地址。
函数参数的引用调用本质上就是指针调用,区别只对于上层语法,底层代码没有区别。
C++类可以有构造和析构函数,这两个函数分别在生成对象和销毁对象时自动调用,这才是C++与C的真正区别,这一点,C语言无法模拟。
构造和析构函数调用顺序如下:构造,先进入构造函数,但是不执行语句,然后开始调用成员的构造函数,全部调用完成后(可能有很多嵌套),才开始执行构造函数内的语句。析构函数,先调用析构函数,并执行完全部语句,但是不返回,开始执行成员的析构函数,执行完成后函数返回。
虚函数,虚函数是一个独立的机制,它在类的内部保存一个指针,这个指针指向的内存是一个函数列表。如果继承类(子类)也声明了这个同名函数,列表里存在的函数会被替换,多重继承就会多次替换(当然是在编译时期就确定的),这样即使在父类中调用这个函数,调用的也是子类的函数。
多重继承,就是把两个父类的成员和函数都放到一个类里面。
虚继承,就是父类的父类如果是同一个类,虚继承不会重复父类的父类的成员,非虚继承则会重复(简单的复制父类的全部成员)。
32位系统下的函数指针本质上只需要32位,但是各种笨拙的C++语法,把这个东西弄的非常复杂混乱。特别是类的成员函数,本质上需要指明第一个参数和函数指针两个对象,才能确定,但是把这样一个概念非用函数指针的语法来表示,所以类的成员函数指针是个怪胎,能不用,就不用。(各种编译器实现也是不同的)。
模板,简单的说,就是给出函数或者类的一个模子,只有模板参数确定的时候,才能生成具体的代码,所以你不能把模板函数或类做到动态链接库中。虽然实际上你能这么做,但是这些函数和对象不在动态链接库中,而是在你编译的时候才生成。模板涉及到的数学概念比C++语言本身要复杂很多很多倍,无法一句话说清楚。但是我们常用的不是很多。
大体上就这么多了吧。这就是C++的全部核心本质。