对 C++一些比较重要的知识点进行了简单的总结
const 与 define 的区别
define 是预编译,是进行编译过程中最先进行的一个过程,会把变量进行直接的替换。
如果代码中出现
1 |
|
编译器就会报错
但是,通过 define 定义的常量只是一种字符串替换,将代码里面所有相同的定义的字符串替换成另一个字符串。
而 const 是在编译过程中的一种定义,是通过编译器来处理的。
这样就导致了 const 与 define 有着不同的特性
- const 定义的常量在内存中只占用一个空间,而 define 定义的常量在内存中占用多个空间,在内存占用方面 const 具有优势。
- define 定义的常量是简单的字符串替换,有可能会触发意想不到的错误,而且 define 定义的常量没有类型,没有类型判断,那又可能出现类型不匹配的错误了。
引用与指针的区别
引用是目标地址,没有自己的空间,可以看作是目标变量的一个别名
而指针相当于一个变量,拥有自己的地址和空间,而空间里面就储存着目标的地址。
这就使得他们分别有着不同的特性
- sizeof(引用)返回的是目标变量的大小,而 sizeof(指针)返回的是指针占用空间的大小
- 指针可以存在多级,如 int **p,是一个指向(指向(整型变量)的指针)的指针,而引用不可以多重引用。
- 指针可以指向 NULL(此时不可以被解引用),而引用没有办法指向 NULL,必须初始化。
- 指针的值可以随时改变,而引用不能被改变。
.h 头文件中的 ifndef/define/endif 的作用?
防止重复 include 头文件。
有的时候我们需要在多个源文件里面 include 同样的头文件,而使用 ifndef/define/endif 使得该头文件只会被 inclued 一次。
面向对象的三个基本特征
封装,继承,多态
封装:用类把对数据操作方法隐藏起来,只留下接口和调用方法给外部,使得数据抽象化。保护数据,使得数据只能由内部方法来修改。
继承:一个类可以通过继承父类来获得父类的功能而不用重新编写,极大地提高了代码的重用率。并且继承之后也可以添加具体的新功能,又保留了父类的基本功能,还可以对父类的功能进行选择性地重写。
多态:同一接口的不同形态,对于传入的一个参数,传给不同的子类,实现不同的功能。实现了接口与实现的分离,提高代码的可维护性。
动态绑定和静态绑定的区别
动态绑定和静态绑定是继承和多态的一种特性
静态绑定的对象的类型再编译的时候已经确定好了,一个对象的静态类型不可被改变,而动态类型可以随时改变。
动态绑定的类型是取决于对象的动态类型。
静态绑定之后对象调用的方法是一定的,而动态绑定的对象的调用的方法却取决于对象的动态类型,这种特性对于面向对象编程提供了极大的灵活性。
main 函数执行以前,还会执行什么代码?
main 函数执行之前,程序还需要进行初始化操作,比如把全局变量放到内存里面,初始化进程等一系列的操作。
描述内存分配方式以及它们的区别?
内存的分配方式主要分为三种。。
第一是在静态储存区,其中又分为 Code Area 和 Static Area,用于储存程序主体执行代码和全局变量以及静态变量和函数。
第二是在 Heap(堆),new/delete/malloc/alloc 等指令操作的内存是在这个区域里面,里面的空间分配可以由代码进行分配和释放。
第三是在 Stack(栈),每个函数的执行以及他们的局部变量都是在栈里分配的,当进入一个函数的时候,就会在栈中为他们分配空间,以及函数里面的变量,当函数结束的时候,栈内相应的空间就会被释放。