const
const编译时特性
const变量
- 根据是否可以在编译期间确定,可以分为编译时常量和运行时常量
const int a = 10; // 编译时常量
const int a = function(); // 运行时常量,无法在编译时使用该变量
const与指针
- 指向常量的指针
const int * a
或int const * a
:指向可以变化,但只能指向const对象
- 指针常量
int * const a
:指向不能变化,指向的对象可以变化
- 编译期间确定or运行时确定根据是否可以从编译期间确定常量值决定
const与函数
- 函数在编译时确定函数签名(包括返回类型、参数类型和数量),运行时确定函数的行为(即它如何操作传入的参数以及它返回什么)
const int& func(int& a)
int& func(const int& a)
int& func(int& a) const{}
:const成员函数- 不允许修改类的成员的值,但可以修改a的值
const与类
const修饰类成员变量
- 在对象的声明周期内是常量,对整个类而言是可以改变的。
- 不能在类内初始化const成员变量,在初始化列表中初始化。
const类对象成员函数
- 不允许修改类的成员的值
const对象
- 只能调用const函数
const -> #define
不同
- 类型
- 宏定义是字符替换,没有数据类型的区别
- const常量是常量的声明,有类型区别
- 安全检查
- 可能产生边际效应等错误
- 在编译阶段进行类型检查
- 编译器处理
- 宏定义是一个”编译时”概念
- const常量是一个”运行时”概念
- 存储方式
- 宏定义:代码段
- const常量:data区
- 是否可以做函数参数
- 可以在函数的参数列表中出现
static
static与局部变量
特点
- 存储位置data区
- 生命周期保持不变
- 局部作用域退出时,数据仍然暂存data区
static与全局变量
特点
- 加入static后,源程序的其他源文件不能再使用该变量(不使用static可以用extern扩展)
static与函数
特点
- 跟全局变量相同,限制作用域,只能在该文件中使用(与全局变量用法也相同)
static与类对象成员变量
特点
- 变量会变成类的全局变量,只能在类外初始化
- 但如果加入const修饰,则可以在类内初始化
static与类对象成员函数
特点
- 类只存在一份函数,所有对象共享,不含this指针,无需创建实例即可访问
- 不可同时用const和static修饰对象的成员函数
static与const总结
static的作用是表示该函数只作用在类型的静态变量上,与类的实例没有关系
const的作用是确保函数不能修改类的实例的状态 static和const不可同时修饰成员函数