const、static、引用混淆解析

const

const 含义

常类型:使用类型修饰符 const 说明的类型,常类型的变量或对象的值是不能被更新的

const 作用

  • 定义常量
  • 类型检查
  • 防止修改
  • 节省空间

注:

  • const 定义的变量只有类型为整数或枚举,且以常量表达式初始化时才能作为常量表达式。其他情况下它只是一个 const 限定的变量,不要将与常量混淆
  • 常量在定义后就不能被修改,所以定义时必须初始化

const 默认为文件局部变量

  • const 变量默认为 extern
  • 要使 const 变量能够在其他文件中访问,必须在文件中显式地指定它为 extern

指针与 const

  • 如果 const 位于 * 的左侧,则 const 就是用来修饰指针所指向的变量,即指针指向为常量
  • 如果 const 位于 * 的右侧,const 就是修饰指针本身,即指针本身是常量。

对于指向常量的指针,不能通过指针来修改对象的值。也不能使用 void * 指针保存 const 对象的地址,必须使用 const void * 类型的指针保存 const 对象的地址。

允许把非 const 对象的地址赋值给 const 对象的指针,如果要修改指针所指向的对象值,必须通过其他方式修改,不能直接通过当前指针直接修改。

const char *p1;   // 指向常量的指针
char * const *p2; // 常指针、const 指针

*p1 = 10; // error
p2 = &val; // error

函数中使用 const

  • 同指针用法相同
  • 常量不可改变,防止修改参数
  • 引用传参,防止修改的同时增加效率
  • 内部数据类型采用值传递
void func(const char *val);
void func(const char &val);

类中使用 const

在一个类中,任何不会修改数据成员的函数都应该声明为 const类型

const 对象只能访问 const 成员函数,而非 const 对象可以访问任意的成员函数,包括 const 成员函数

static

静态变量

函数或类中的变量

  • 函数中:当变量声明为 static 时,空间将在程序的生命周期内分配。即使多次调用该函数,静态变量的空间也只分配一次,前一次调用中的变量值通过下一次函数调用传递
  • 类中:声明为 static 的变量只被初始化一次,在单独的静态存储中分配了空间,因此类中的静态变量由对象共享。 对于不同的对象,不能有相同静态变量的多个副本。因此,静态变量不能使用构造函数初始化。

静态成员

类对象和类中的函数

对象也在声明为 static 时具有范围,直到程序的生命周期

静态成员函数仅允许访问静态数据成员或其他静态成员函数,无法访问类的非静态数据成员或成员函数。

引用

左值引用:常规引用,及起别名。int &p = val;右值引用:绑定到右值的引用。(值——临时对象、将要销毁的对象) int &&p = 3;

右值引用可实现转移语义(Move Sementics)和精确传递(Perfect Forwarding),它的主要目的有两个方面:

  • 消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。
  • 能够更简洁明确地定义泛型函数。

vs 指针

引用 指针
必须初始化 可以不初始化
不能为空 可以为空
不能更改目标 可以更改目标

注:底层实现时 C++ 编译器实现这两种操作的方法完全相同