文章

const类型限定符

const type qualifier.

const类型限定符

:变量、类对象、类实例 统称为变量

const修饰变量

const与普通变量

const修饰普通变量(即定义 常变量/常量),必须在声明(定义)的同时进行初始化,因为通过const定义的普通常变量,在定义之后不能(无法)修改其值。

格式:
(1)const 数据类型 变量名 = value;
(2)数据类型 const 变量名 = 值;

以上两种格式在功能(效果 / 作用)上没有区别,但通常使用格式(1)

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <string>

int main()
{
    // 以下是正确的
    const int a = 10;
    const char ch = 'a';
    std::string const ss("夏尔·凡多姆海威");

    // 以下是错误的,因为没有初始化
    const int b;
    const float f;

    return 0;
}

const与指针变量

格式:
(1)const 数据类型 *变量名;
(2)数据类型 const *变量名;
(3)数据类型 * const 变量名 = 地址;
(4)const 数据类型 * const 变量名 = 地址;
(5)数据类型 const * const 变量名 = 地址;

说明:

  1. 格式(1)同格式(2),通常使用格式(1)。
  2. 格式(4)同格式(5),通常使用格式(4)。
  3. 也就是说,实际编程中,会使用的格式有:(1)、(3)、(4)。

格式(1),示例:

1
2
3
4
5
6
7
8
9
char ch1 = 'a';
char ch2 = 's';

const char* p1;  // *p1为常量,指针p1为变量;p1可以不初始化
p1 = &ch1;  // 操作正确:p1为变量,可以修改p1的值,使指针变量指向别的地址
*p1 = 'r';  // 操作错误:*p1为常量,不能通过指针修改所指向的内存空间中的值(保存的数据)

const char* p2 = &ch2;
*p2 = 'c';  // error,同 *p1 = 'r';

格式(3),示例:

1
2
3
4
5
6
7
8
9
10
int n = 7;
int m = -1;

int* const p1 = &n;  // 正确,指针p1为常量;必须在定义指针p1的同时进行初始化

*p1 = 6; // 正确,*p1为变量,n也是变量,可以通过*p1修改整型变量n的值

p1 = &m; // 错误,指针p1为常量,不能修改其指向的地址

int* const p2; // 错误,未初始化

格式(4),示例:

1
2
3
4
5
6
7
8
9
float pi = 3.14;
float f = 2.5;

const float* const p1 = &pi;  //  正确,指针p1为常量,必须在定义的同时进行初始化

*p1 = 0.618;  // 错误,*p1为常量,不可修改(不能通过指针修改所指向的内存空间的数据)
p1 = &f;      // 错误,指针p1为常量,不可修改(不能修改其指向的地址)

const float* const p2;  // 错误,未初始化

const与#define

  1. const定义的常量有类型,#define定义的常量(宏定义)没有类型,编译可以对const常量进行类型安全检查,而#define常量仅仅是做简单替换。
  2. const定义的常量在编译时分配内存,而#define定义的常量是在预编译时进行替换,不分配内存。
  3. 作用域不同,const定义的常变量的作用域和该变量的作用范围相同。#define定义的常量其作用域为定义点到 #undef取消为止文件结束
  4. 定义常量还可以使用enum,尽量使用const、enum代替#define来定义常量。
  5. #define定义的常量,容易产生副作用。

高层次编程,尽可能使用const、enum、inline代替#define。

底层编程,#define是很灵活的。

const与成员函数

const放到类的成员函数的参数列表(小括号)之后,函数体之前,那么此函数不能修改类成员变量

如果想在const成员函数内修改成员变量,需用mutable关键字修饰要修改的成员变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Entity
{
private:
    int x;
    mutable int y;  // mutable 关键字

public:
    int get_X() const  // const成员函数
    {
        // x = 10;  // 出现错误,不可修改
        y = 5;  // 可以修改
        return x;
    }
    void set_X(int x)
    {
        this->x = x;
    }
};
本文由作者按照 CC BY 4.0 进行授权