虚函数表
在有虚函数的类中,存在一个虚函数指针,该指针指向一张虚函数表,当子类继承基类的时候,也会继承其虚函数表。当子类重写基类中的虚函数时,会将虚函数表中的地址替换成重写的函数地址。
(图片来自 https://www.cnblogs.com/bewolf/p/9352116.html)
char* 和 char[] 的区别
char *s1 = "abc"; char s2[] = "abc"
以上两种定义方式直接输出结果,则都能正常输出。但修改 \(s1\) 的内容会引起程序崩溃,而修改 \(s2\) 的内容不会。
因为 \(abc\) 是保存在常量区内,而第一种方式是利用指针直接指向常量区,第二种方式是通过数组将 \(abc\) 复制出来,存储在栈区内,所以修改 \(s2\) 的值不会崩溃而修改 \(s1\) 的值会。
C++ 程序内存结构
C++ 程序的内存分区自低地址至高地址分别分为 代码区、常量区、静态(全局)存储区区、堆区、栈区。
- 代码区存放程序代码,是只读的。
- 常量区存放常量,这里的量不可被改变。
- 静态变量和全局变量存放在静态存储区内,一直到程序全部结束后才会释放内存。
- 堆区内存由程序员利用 \(malloc、free、new、delete\) 分配,若申请了空间但忘记释放,容易造成内存泄漏。
- 栈区存放函数内的局部变量,形参,和函数返回值。当数据过了作用范围后,系统就会回收内存。
C++ 中常量
定义常量有两种方法,第一种是使用 \(define\) 定义,另一种是通过 \(const\) 修饰,常量不可被修改。全局对象存放在静态区内,局部对象存放在栈区内。
const 关键字作用
- 通过 \(const\) 修饰的变量,成为常变量,不可被修改。
- 通过 \(const\) 修饰的类成员函数,成为常函数,该函数不可修改类内的成员变量。
- 两个类成员同名函数,一个带有 \(const\),一个不带 \(const\),相当于重载,会根据类对象是否是 \(const\) 修饰的决定调用哪个函数。
- 通过 \(const\) 修饰指针
int x = 10; const int *a = &x; int* const b = &x;
其中 \(const\) 修饰的分别是 \(*a\) 和 \(b\),那么对于 \(a\) 而言,可以修改 \(a\) 的指向,而不能修改 \(*a\) 所指向的值,对于 \(b\) 而言,可以修改 \(*b\) 所指的值,而不能修改 \(b\) 的指向。
来源:https://www.cnblogs.com/Jiaaaaaaaqi/p/12288281.html