一.static关键字的作用
全局静态变量 | 局部静态变量 | 静态函数 | 类的静态成员 | 类的静态函数 | |
定义 | 在全局变量前加上关键字static | 在局部变量前加上static | 在函数返回类型前加上static,函数只能在声明他的文件中所用 | 静态成员可以实现多个对象之间的数据共享,静态成员是类的所有对象中共享的成员,而不是某个对象的成员,对多个对象来说,静态数据成员只存储一处,供所有对象共用 | 静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员 |
存储区域 | 静态存储区,在整个程序运行期间一直存在 | 静态存储区 | |||
初始化 | 未经初始化的全局静态变量会被自动初始化为0 | 未经初始化的局部静态变量会被自动初始化为0 | |||
作用域 | 生命全局变量的本文件内 | 仍是定义它的函数或语句块 |
| ||
备注 | 但当局部静态变量离开作用域后,并没有立即销毁,而是仍然存在内存中,只不过我们不能再对它进行访问,直到函数再次被调用并且值不变 | 对于其他文件中声明的同名函数不冲突 | 静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。静态成员的引用不需要用对象名 | 如果静态成员函数中要引用非静态成员时,可通过对象来引用。从中可看出,调用静态成员函数使用如下格式:<类名>::<静态成员函数名>(<参数表>); |
二、C++的四种cast转换
1.static cast:内置基本类型之间的转换,以及子类向基类的转换,基类向子类的转换会出错
2.dynamic cast:基类一定要有虚函数,动态编联,继承类的指针或引用转换,只能向上转换
3.reinterpret_cast:什么都可以转换
4.const_cast 最常用的用途就是删除变量的const属性
三、指针和引用的区别
1.NULL:指针可以是空指针,但引用不可以是空引用,使用指针时需要对其进行判断
2.指向的对象:指针可以改变指向的对象,但是引用不可以
3.++:指针的自加表示指向下一个地址的元素,但引用的自加表示对象值的自增
4.const:指针本身是可以定义为常量指针的,但引用本身不可以。指针和引用都可以指向const对象
5.初始化:指针可以不进行初始化,但引用必须进行初始化
四、const的作用
参考链接:https://blog.csdn.net/Eric_Jo/article/details/4138548
1.防止被更改:用const定义的变量不能被更改,函数的参数被声明为const的时候,可以防止他们被更改
2.区别于define:用const定义的变量有数据类型,会对类型安全进行检查,而define只是进行简单的字符替换
3.同宏定义一样,可以很方便的进行修改
4.区别于宏:const存储在符号表中,存储快速,而define会有很多的备份
const用法:
const int a :a本身不能被修改
const int *a :a指向的对象不能被修改
int *const a :a不能改变指向
const int *const a :a的指向和a指向的对象都不能被改变
const修饰的类成员,表示不成员常量,不能被修改只能在初始化列表中赋值
const修饰的成员函数,不能修改类中的任一成员,只有const函数才可以调用对象中的const常量
const修饰的对象或对象指针或对象引用:不能改变其中的任一成员,并且只能调用该类里面的常量函数,因为非常量函数有更改成员变量的可能
五、指针和数组的区别
指针 | 数组 | |
存储的内容 | 地址 | 数据 |
访问数据的方式 | 从地址中提取简介访问数据 | 通过下标直接访问数据 |
数据结构 | 动态数据结构 | 数组长度固定,类型相同 |
申请内存的方式 | malloc/free,new /delete | 隐式申请 |
六、数组和链表的区别:
数组 | 链表 | |
内存 | 占有连续的内存空间 | 可以利用内存的碎片化 |
所占空间的灵活性 | 空间大小固定,空间利用效率低 | 动态申请和释放内存 |
插入/删除 | O(N) | O(1) |
随机访问 | O(1) | O(N) |
扩容 | 将旧的地址空间的内容复制到新的空间里 | 一个节点中包含val和指针 |
栈分配 | 堆分配 |