看一个例子:在C语言中实现圆面积计算
1 #include <stdio.h> 2 3 #define PI 3.14 4 5 int main(int argc, char const *argv[]) { 6 float r = 0.5; 7 float n = PI * r * r; 8 printf("n=%f ", n); 9 return 0; 10 }
在上面的宏定义PI,并不知道他的类型,没有类型检查,只是简单替换。
在C++中,有一个新的关键字const常量--在所在生命周期内,其值不变,常量一旦定义了,就不可以再次赋值,所以要在定义时赋值。
const float FPI = 3.14;
编译器在程序编译时期做检查,即const常量在程序编译的时候不可以修改
2、const 指针
例子:
1 #include <iostream> 2 #include <string> 3 using namespace std; 7 8 int main(int argc, char const* argv[]) { 9 char* p = "Hello World!"; 10 p[0] = 'a'; 11 return 0; 12 }
编译通过,执行时段错误。因为字符串常量分配的内存可见只允许读不可写。
1) const TYPE* / TYPE const*
通过加上const修饰指针,const在*前面, 使编译时检查,表示指针指向的内容不可修改,但是指针的值可以改变。
char const* p = "Hello World!"; const char* p2 = "Hello World!"; char* p3 = nullptr; p = p3;
2) TYPE* const
char szBuf[256] = "Hello World!"; char* const p = szBuf; p[0] = 'A'; //p = nullptr; //error:assignment of read-only variable ‘p’
3)const_cast
可以用于去除const修饰
const int n = 5; // int* p = (int*)&n; int* p = const_cast<int*>(&n); *p = 1;