const
不考虑类的情况
- const 常量在定义时必须初始化,之后无法更改。
- const 形参可以接收 const 和非 const 类型的实参,例如:
// i 可以是 int 型或者 const int 型
void fun(const int i){
//函数实体 ...
}
考虑类的情况
- const 成员变量:不能在类定义外部初始化,只能通过构造函数初始化列表进行初始化,并且必须有构造函数;不同类对其 const 数据成员的值可以不同,所以不能在类中声明时初始化。
- const 成员函数:
- const 对象只能调用 const 成员函数,不可以调用非 const 成员函数;非 const 对象既可以调用非 const 成员函数,也可以调用 const 成员函数。
- const 成员函数不可以调用其它非 const 成员函数,因为 const 成员函数不可以被改变,而非 const 成员函数可以改变,如果 const 成员函数调用了非 const 成员函数,非 const 成员函数就有可能会破坏 const 成员函数的常性。反之,非 const 成员函数是可以调用其它 const 成员函数的,因为它不会改变 const 成员函数。
static
不考虑类的情况
- 隐藏。所有不加 static 的全局变量和函数具有全局隐藏性,可以在其它文件中使用,加了 static 之后只能在该文件所在的编译模块中使用。
- 默认初始化为 0,包括未初始化的全局静态变量和局部静态变量,都存在全局未初始化区。
- 静态变量在函数内定义,始终存在,且只进行一次初始化,具有记忆性,其作用范围与局部变量相同,但是函数退出后仍然存在但不能使用。
考虑类的情况
- static 成员变量:只与类关联,不与类的对象关联。定义时要分配空间,不能在类声明中初始化,必须在类外初始化,初始化时不需要标志为 static;static 成员变量可以被非 static 成员函数任意访问。
- static 成员函数:不具有 this 指针,无法访问类对象的非 static 成员变量和非 static 成员函数;不能被声明为 const 、virtual 和 volatile;static 成员函数可以被非 static 成员函数任意访问。
- static 对象在函数进入主程序之前就已经被分配空间并创建。