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++ 编译器实现这两种操作的方法完全相同