0%

C++ 中的 static 与 const

C++ 中的 CV 特性

static

  1. static 修饰全局函数 / 全局变量,可以让原本具有全局作用域的函数 / 变量, 变成只在文件内有效
  2. static 修饰局部变量, 改变局部变量的生命周期为整个程序运行周期 (作用域不变), 该变量只初始化一次,之后每次进入它的作用域都可以访问使用; static 局部变量下次再访问还是上次保留的值
  3. static 修饰类成员变量 / 成员函数,可以让变量 / 函数成为类成员, 而不是实例成员

warning:不要再头文件中声明 static 的全局函数, 不要在 cpp 内声明非 static 的全局函数,如果你要在多个 cpp 中复用该函数, 就把它的声明提到头文件里去,否则 cpp 内部声明需加上 static 修饰;

const

  1. 修饰变量,阻止变量被修改,const 变量必须在声明时初始化, 否则后面无法初始化了
  2. 修饰指针,对于指针来说,既可以指定指针本身为 const (顶层 const), 让指针的值不能修改;也可以指定指针指向的值为 const 不能修改 (底层 const); 或者指定两者都是 const
  3. 修饰形参,表示在函数内部不能修改输入参数的值
  4. const 成员函数,表示函数内不会修改类的成员变量 (除了 mutable 成员)
  5. 修饰返回值,表示函数的返回值不能被修改,不是左值

注意第 4 点,const 成员函数不可以修改类的非 mutable 成员变量, 而且 const 成员函数与非 const 成员函数可以重载

const 的类对象只可以调用 const 的类成员函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class C {
public:
void dis() { printf("%s\n", "dis"); }
void dis() const { printf("%s\n", "const dis"); }
void test() { printf("%s\n", "test"); }
};

int main() {
C c;
c.dis();
const C cc;
cc.dis();
// cc.test(); // 编译出错
return 0;
}

1
2
3
4
5
// 两个dis函数是重载函数! 并不会编译出错, 头一个对象是普通对象, 调用dis函数也是非const版本;
// 第二个cc对象是const对象, 它只能调用自己的const函数!!
// 程序输出:
// dis
// const dis