在本章中,我们将学习const数据成员,变量和定义宏。const和#define都用于处理源代码中的常量,但是它们之间几乎没有区别。
1)#define是预处理器指令,而const是关键字
#define用于定义一些带有名称(字符串)的值,此定义的字符串在C,C ++中被称为宏定义,而const是关键字或用于使标识符(即常数)的值恒定。
2)#define不是范围控制的,而const是范围控制的
通过包含相关的头文件,可以在程序或其他文件中的任何位置使用宏,因此宏不受作用域控制,但是可以在函数内部声明常量,因此只能在函数/作用域内对其进行访问。在其中声明了常量,因此,可以说const成员始终受范围控制。
使用const始终是一个好习惯。因为在使用const时我们可以控制其范围。如果将其放置在任何用户定义函数内部,则其效果将本地化到该函数;如果将其放置在所有用户定义函数外部,则它将对所有文件变为全局。
#include <iostream> using namespace std; //宏定义 #define X 30 //全局整数常量 const int Y = 10; int main(){ //本地ineteger常量` const int Z = 30; cout<<"Value of X: "<<X<<endl; cout<<"Value of Y: "<<Y<<endl; cout<<"Value of Z: "<<Z<<endl; return 0; }
输出结果
Value of X: 30 Value of Y: 10 Value of Z: 30
在上面的程序中,X是全局符号常量,但是在编译之前进行了预处理,Y是全局常量,而Z在主要函数中是局部的。
3)宏(#define)可以重新定义,但const不能
宏(已定义)可以在程序中的任何位置(通过未定义然后定义)重新定义,但是即使我们无法在常量中重新分配常量,也无法重新声明或重新定义常量。
#include <iostream> using namespace std; //宏定义 #define X 30 int main(){ cout<<"Value of X: "<<X<<endl; #undef X #define X 300 cout<<"Value of X: "<<X<<endl; return 0; }
输出结果
Value of X: 30 Value of X: 300
在这里,您可以看到我们已经更改(重新定义)了X的值,并且它已经更改,程序成功执行并且值已更改。
#include <iostream> using namespace std; //常量int- const int Y=10; int main(){ cout<<"Value of Y: "<<Y<<endl; Y=100; //错误,我们无法将值赋给const- cout<<"Value of Y: "<<Y<<endl; return 0; }
输出结果
main.cpp: In function 'int main()': main.cpp:10:3: error: assignment of read-only variable 'Y' Y=100; //错误,我们无法将值赋给const- ^
在这里,您可以看到我们无法更改常量的值,在这里我们尝试更改Y的值,但是存在编译错误。