const 和static
int main(){
const int a = 10;
static int b = 20;
}
汇编
main:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 10
mov eax, 0
pop rbp
ret
- static
- 不考虑类
- 隐藏,不加static的全局变量和函数全局可见,可以在其他文件使用;加了就只能在本文件中使用。
- 默认初始化为0,存在全局未初始化区。
- 静态变量在函数内定义,跟局部变量作用域一样,函数退出后,存在但不可用。
- 考虑类
- 成员变量:与类关联,不与对象关联。定义时会分配空间,不能在类声明的时候初始化,可以被非static成员函数任意访问。
- 成员函数:不具有this指针,无法访问类对象的非static成员变量和成员函数;不能被声明为const,需函数和volatile;可以被非static成员函数任意访问。
- 不考虑类
class A{
public:
static int i;//静态成员变量
};
int A::i = 20;
int main(){
A* a;
A* b;
cout << "a:" << a->i << " b:" << b->i <<endl;
}
//输出:a:20 b:20
- const
- 不考虑类
- 常量必须初始化,之后无法更改
- 形参可以接收const和非const的实参
- 考虑类
- 成员变量:不能在类定义的外部初始化,只能通过构造函数初始化列表初始化,并且必须有构造函数;不同对象的const成员变量可以不同,所以不能在类声明的时候初始化。
- 成员函数:const对象不能调用非const成员函数;非const对象都可以调用;
- 不考虑类