Table of Contents
#custom-toc-container
const限定符
# const修饰变量 ## const与普通变量 const修饰普通变量(定义 常变量/常量),必须在声明(定义)的同时进行初始化,因为通过const定义的普通常变量,在定义之后不能(无法)修改其值。 **格式:** * const 数据类型 变量名 = 值; * 数据类型 const 变/常量名 = 值; 以上两种格式在功能(效果、作用)上没有区别,但通常使用格式(1)。 ```cpp // 以下是正确的 const int a = 10; const char ch = 'a'; // 以下是错误的 const int b; const float f; ``` ## const与指针变量 **格式:** * const 数据类型 *变量名; * 数据类型 * const 变量名 = 地址; ```cpp // 关于格式(1) char ch = 'a'; char ch2 = 's'; const char *p1 = &ch; // *p1为常量,指针p1为变量;p1可以不初始化 p1 = &ch2; // 操作正确:p1为变量,可以修改p1的值,使指针变量指向别的地址 *p1 = 'r'; // 操作错误:*p1为常量,不能通过指针修改所指向的空间中的值(保存的数据) // 关于格式(2) int n = 5; int m = -6; int * const p2 = &n; // *p2为变量,指针p2为常量;必须在定义指针p2的同时进行初始化 *p2 = 20; // 正确,,*p2是变量、n也是变量,可以通过*p2修改整型变量n的值 p2 = &m; // 错误,,指针p2为常量,不能修改其指向的地址 ```
------ 2023-6-11 星期日 10:06:31 ------
# const与#define const定义的常量有类型,#define定义的常量(宏定义)没有类型,编译可以对const常量进行类型安全检查,而#define常量仅仅是做简单替换。 const定义的常量在编译时分配内存,而#define定义的常量是在预编译时进行替换,不分配内存。 作用域不同,const定义的常变量的作用域和该变量的作用范围相同。#define定义的常量其作用域为定义点到程序结束,可以在某个地方使用#undef取消 定义常量还可以使用enum,尽量使用const、enum替换#define来定义常量。 \#define定义的常量,容易产生副作用。 高层次编程,尽可能使用const、enum、inline代替#define。底层编程,#define是很灵活的。
------ 2023-6-11 星期日 10:52:00 ------
# const与成员函数 const放到类的成员函数的参数列表(小括号)后面,那么此函数不能修改类成员变量。 如果想在函数内修改成员变量,需用`mutable`关键字修饰。 ```cpp class Entity { private: int x; mutable int y; public: int get_X() const { // x = 10; // 出现错误,不可修改 y = 5; // 可以修改 return x; } void set_X(int x) { this->x = x; } }; ```