前言:咱先讲讲define
在C程序中,我们常用define,把符号常量化
比如: #define PI 3,1415;
这称之为宏定义,宏定义不是变量,没有类型,不占用存储单元,它有个特点:把源代码中所有的 PI(例变量名) 全部替换成 3.1415
注意:宏定义只是在源代码编译时进行替换,编译完成之后,程序中不再有宏名PI这个标识符
引出const
C++引入const修饰符是 为了定义常量
例如: const int PI = 3.1415;
这个常量PI是有类型的,它是通过编程者手动定义的一个变量,占用存储单元,有地址,可以用指针指向它,但是我们不能修改它的值,虽然它是个变量,但是我们通过const把它的值给固定了,无法进行修改了,所以它现在成了个“常量”
这就出现区别了
说说define和const的区别
define:
宏定义不是变量,没有类型,不占用存储单元,它有个特点:把源代码中所有的 PI(例变量名) 全部替换成 3.1415
const:
通过编程者手动定义的一个变量,占用存储单元,有地址,可以用指针指向它,但是我们不能修改它的值,虽然它是个变量,但是我们通过const把它的值给固定了,无法进行修改了,所以它现在成了个“常量”
const的优势
因为define把代码中所有的 相关变量名进行了替换,可能出现一种情况,盲目替换产生一定的麻烦
因此,通过const消除了这个不安全性
const与指针的用法
const与指针变量也能一起使用,组合情况分三种
指向常量的指针变量、常指针变量、指向常量的常指针变量
可以解释一下这三种吗?
-
指向常量的指针变量
一个普通的指针变量,但是它指向了一个常量这个指针变量的值可以进行改变,即,这个指针可以指向其他的常变量,但是如果它指的是const类型的数据,那就不能改变了
const char *name = "abc" name[2] = 'Z'; # 这种是错误的,不能改变常量 name = "bcde"; # 这种是正确的,name指向了其他常量
-
常指针变量
指把指针变量所指的值(地址)定义为不可改变的常量,而对该指针变量存放的地址值对应的存储空间里存储的数据可以修改
char *const name = "abc"; name[2] = 'Z'; # 这种是正确的,改变值 name = "bcde"; # 这种是错误的,name不能指向其他常量
name = “bcde” 意思是 分配一块储存空间,把"bcde"存入,再将这块存储空间的首地址赋值给name,但是const 的存在,要求name不能改变存储空间首地址。
-
指向常量的常指针
指初始化之后,这个指针变量的值(地址)不能变,指向的存储空间的数据也不能变。
const char* const name="abc"; name[2] = 'Z'; # 这种是错误的,不能改变值 name = "bcde"; # 这种是错误的,name不能指向其他常量
举例
定义圆周率π为const常量,求周长和面积
#include <iostream>
using namespace std;
const float PI = 3.1415;
int main() {
float r;
cin >> r;
cout << 2 * PI * r << endl << PI * r * r;
return 0;
}