C++ const & static

 

const

const编译时特性

const变量

  • 根据是否可以在编译期间确定,可以分为编译时常量和运行时常量
const int a = 10;         // 编译时常量
const int a = function(); // 运行时常量,无法在编译时使用该变量

const与指针

  • 指向常量的指针
    • const int * aint 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不可同时修饰成员函数