define
在C语言中,#define 是一个预处理指令,用于创建宏定义(Macro Definition)。宏定义是一种文本替换机制,允许你在代码中使用标识符来代替一段文本。
const
在C++中,const 是一个关键字,用来修饰的内容不可变。
1. define
#define 的一般语法如下(了解即可):
1.定义常量
2.创建函数式宏
3.定义条件编译标志
4.字符串化宏
5.连接宏
1.1 定义常量
#define PI 3.14159265
这将创建一个名为 PI 的宏,它将在程序中代表 3.14159265。
1.2 创建函数式宏
#define SQUARE(x) ((x) * (x))
这将创建一个名为 SQUARE 的宏,它接受一个参数 x,并返回 x * x 的结果。比如可以在代码中使用 SQUARE(5) 来得到 5 的平方。
1.3 定义条件编译标志
#define DEBUG 1
这可以用于在编译时控制是否包含调试代码。例如可以在代码中使用 #ifdef DEBUG 来包含调试语句。
1.4 字符串化宏
#define STRINGIFY(x) #x
这将创建名为 STRINGIFY 的宏,可将标识符转换为字符串。例如STRINGIFY(Hello) 将被替换为 "Hello"。
1.5 连接宏
#define CONCAT(x, y) x##y
这将创建名为 CONCAT 的宏,可将两个标识符连接在一起。例如CONCAT(a, b) 将被替换为 ab。
2. const
以下是几种const
关键字的用法:
1. 定义常变量
2. 定义常量指针
3. 用来指向常量的指针
4. 定义常量成员函数
5. 定义常量引用参数
6. 定义常量对象
2.1 定义常变量
#include <iostream> using namespace std; int main() { const int Number=10; //定义常变量 //Number=20; 使用此语句则报错:assignment of read-only variable 'Number' printf("%d\n",Number); //输出10 return 0; }
在这个例子中,Number
被声明为一个常变量,其值在声明后不可被修改。这可以用于创建不可变的数值或对象。
2.2 常量指针
int x = 5; const int* ptr = &x;//*ptr 不变,ptr可变 *ptr = 6; //error ptr=&b; //ok b=66; //ok
这里,const int*
表示指向整数的常量指针。通过这种方式声明的指针,不能用于修改指向的值,但可以指向不同的整数。
2.3 指针常量
string str="hello"; int* const ptr = str;//指针常量,*ptr可变,ptr不变 *ptr='a'; //ok ptr=str2; //error
在这个例子中,int* const
表示一个指向整数的指针常量,指向的整数可以被修改,但指针本身不可被重新赋值。
2.4 常量指针常量
const int* const ptr;//*ptr与ptr都不可变 *ptr=5; //error ptr=&a; //error
2.5 定义常量成员函数
class MyClass { public: void SomeFunction() const { // 不能修改成员变量 } };
在类中,成员函数声明中的const
关键字表示该函数是一个常量成员函数,它不能修改类的成员变量(除非它们声明为mutable
)。
2.6 定义常量引用参数
void MyFunction(const int& value) { // 不能修改传入的参数 }
函数参数前的const
关键字表示传入的参数是一个常量引用,函数内部不能修改这个参数的值。
2.7 定义常量对象
const MyClass obj;
在这个例子中,obj
是一个常量对象,意味着它的成员变量只能在构造函数中初始化,不能在对象创建后被修改。
3. 易错
1. const和define的区别
#define PI 3.14 //符号常量 const float PI=3.14; //常变量
const用于定义常量;而define用于定义宏,而宏也可以用于定义常量。都用于常量定义时,它们的区别有:
- const定义的常变量具有变量的基本属性,包括数据类型和存储单元,而#define无
- 有些编译器可以对const常变量进行调试,不能对宏调试
- 符号常量采用#define指令,属于预编译指令,在预编译后,符号常量就不存在了(比如符号常量PI全被置换成3.14)
那为什么有了const还需要#define呢?
const无法代替宏作为卫哨来防止文件的重复包含
2. const int *a, int const *a, const int a, int *const a, const int *const a分别是什么,有什么特点
1. const int a; //a是常量,值不允许修改。
2. int const *a(等价const int *a); //a指针所指向的内存里的值不变,即(*a)不变,a可变
3. int *const a; //a指针所指向的内存地址不变,即(*a)可变,a不变
4. const int *const a; //都不变,即(*a)不变,a也不变
3. 简述常量指针和指针常量的区别
//const* 是常量指针,*const 是指针常量
int const *a; //a指针所指向的内存里的值不变,即(*a)不变
int *const a; //a指针所指向的内存地址不变,即a不变