Const

C++ 中的 const 用在定义变量的时候,表示 变量值不能改变,而且因为不能改变,所以 在定义的时候必须初始化。

下面介绍一些使用情况。

Const + 指针

const 与指针一起用的时候,一般会有两种情况:

  • const 修饰指针本身;
  • const 修饰指针指向的对象。

这两种情况虽然都是用 const,但其实是截然不同的用法,如下:

1
2
3
int i = 0;
int *const j = &i;  // const 修饰指针 j
const int *k = &i;  // const 修饰指针 k 指向的对象 i

对于修饰指针本身的 const,其关键字其实是 int * const,表示这个指针 j 不能改,但是可以通过指针 j 来修改它指向的对象 i 的值。

对于修饰指针指向的对象的 const,其关键字其实是 const int *,表示不能通过这个指针 k 去修改它指向的对象 i 的值,但是可以修改指针 k 本身。

Const + 引用

const 与引用一起用的时候,因为引用本身就不能改自身,所以与 const 一起使用只有一种情况,如下:

1
2
int i = 0;
const int &j = i; // const 修饰引用 j 引用的对象 i

此时我们不能通过引用 j 来修改 i 的值。

Const + 函数形参(值传递)

例如:

1
void fcn(const int i) { /* ... */ }

表示形参 i 在函数体重不允许修改。

Const + 函数形参(指针/引用传递)

例如:

1
2
void fcn2(const int &x) { /* ... */ }
void fcn2(const int *y) { /* ... */ }

表示不允许通过指针 x、引用 y 来修改指向的对象。

Static

C++ 中的 static 关键字的用法可以根据「是否面向对象」分成两类,如下:

  • 基于过程
    • 静态全局变量(面向过程)
    • 静态局部变量(面向过程)
    • 静态函数(面向过程)
  • 面向对象
    • 静态成员变量(面向对象)
    • 静态成员函数(面向对象)

以下分别介绍。

基于过程

静态全局变量

在全局变量前,加上关键字 static,该变量就被定义成为一个 静态全局变量,有以下特点:

  • 在 全局数据区 分配内存(除了该区之外内存还有代码区、堆区、栈区)。
  • 如果没有显式初始化,程序会自动初始化为全 0。
  • 在声明它的整个文件都是可见的,在文件之外不可见;

静态局部变量

在局部变量前,加上关键字 static,该变量就被定义成为一个 静态局部变量,有以下特点:

  • 在 全局数据区 分配内存。
  • 如果没有显式初始化,程序会自动初始化为全 0。
  • 在声明它的局部作用域内可见,在局部作用域之外不可见;
  • 一般在第一次运行到声明处时初始化,之后的函数调用执行到这里不会再初始化。

静态函数

在函数的返回类型前加上 static 关键字,函数即被定义为 静态函数,有以下特点:

  • 它只能在声明它的文件当中可见,不能被其它文件使用。

面向对象

静态成员变量

在类内成员变量的声明前加上关键字 static,该成员变量就是类内的 静态成员变量,有以下特点:

  • 存储在 全局数据区。
  • 由所有对象共有。

静态成员函数

在类内成员函数的声明前加上关键字 static,该成员函数就是类内的 静态成员函数,有以下特点:

  • 不能调用或使用非静态的成员函数、成员变量。

参考

▲