1. const
‘const’
关键字用于定义常量,表示变量的值在初始化后不能被改变。
作用:
- 常量声明:
const
修饰的变量在初始化后不能再被修改。下面是C++代码 -
const int max_value = 100; max_value = 200; // 错误,max_value 是常量,不能修改
常量指针:指针可以指向常量,或者指针本身可以是常量。
const int* ptr = &max_value; // 指向常量的指针,不能通过 ptr 修改 max_value 的值 int* const ptr2 = &max_value; // 常量指针,ptr2 本身不能指向其他位置
函数参数:通过
const
修饰函数参数,可以防止参数在函数内部被修改。void print(const int value) { // value 不能在函数内被修改 }
注意:
const
修饰的变量必须初始化。- 在 C++ 中,
const
可以用于定义类成员函数,表示该成员函数不会修改类的成员变量。
2. static
static
关键字具有不同的含义,具体取决于它的使用场景。
作用:
- 静态局部变量:在函数内部,
static
修饰的变量是静态局部变量,它在函数调用结束后依然存在,并保留其值。void func() { static int count = 0; count++; cout << count << endl; // 每次调用,count 的值会递增,而不是每次初始化为 0 }
静态全局变量:在全局作用域内,
static
修饰的变量或函数的作用域限制在定义它的文件中。static int globalVar = 100; // 只在当前文件中可见
类的静态成员:在类中,
static
修饰的成员变量或成员函数属于类,而不是类的对象,可以通过类名直接访问。class MyClass { public: static int staticVar; static void staticFunc() { // 静态成员函数可以访问静态成员变量 } }; int MyClass::staticVar = 0;
注意:
- 静态成员变量在类的所有对象中共享。
- 静态成员函数不能访问非静态成员变量,因为它们不属于具体对象。
3. typedef
typedef
关键字用于为已有类型定义新的类型名称,以简化代码书写。
作用:
这些关键字各自有不同的使用场景,可以帮助你更好地组织代码、控制变量的作用域和生命周期,提升代码的可读性和维护性。
- 类型别名:通过
typedef
,你可以为复杂的数据类型定义一个简洁的别名。typedef unsigned long ulong; ulong a = 1000; // 相当于 unsigned long a = 1000;
简化复杂类型:在定义复杂类型(如函数指针、结构体、联合体)时,
typedef
可以显著提高代码的可读性。typedef int (*FuncPtr)(int, int); // 定义一个函数指针类型 FuncPtr myFunc;
注意:
- 在现代 C++ 中,
typedef
在某些情况下可以被using
关键字替代,因为using
更强大且更灵活。using ulong = unsigned long;
4.
#define
#define
是一个预处理指令,用于定义宏,它在编译前由预处理器进行替换。作用:
- 宏定义:可以用
#define
为常量、表达式、甚至代码片段定义宏。 -
#define PI 3.14159 #define MAX(a, b) ((a) > (b) ? (a) : (b)) // 定义宏函数
条件编译:与
#ifdef
、#ifndef
等一起使用,可以控制代码的编译。#define DEBUG #ifdef DEBUG cout << "Debug mode" << endl; #endif
注意:
- 宏没有类型检查,也没有作用域的概念,这可能导致意外的错误。
- 宏在定义后被简单地文本替换,这可能会引入隐藏的错误和复杂的调试。
总结
const
:用于定义不可变的常量,增强代码的安全性和可读性。static
:根据上下文不同,用于定义静态局部变量、静态全局变量和类的静态成员,控制变量的生命周期和作用域。typedef
:用于为现有类型定义别名,简化复杂类型的使用。#define
:预处理指令,用于定义宏,实现简单的文本替换和条件编译。