一,const常量
const的意思是常量
const float PI=3.14;
PI=3;//会报错,PI不可修改
注意
1,常量定义以后不能再继续赋值,所以在定义时最好顺便初始化。
2,常量不能赋值的确切意思是不能在编译过程中赋值,而不是说在运行过程中不能赋值。在运行过程中如果通过操作指针,同样可以对该变量赋值,但一般用不上这种操作,如下:通过该例子再体会一下指针直接修改内存的作用。
float* p=(float*)Π
float input;
cin>>input;
*p=input
在调试过程中查看内存会发现PI的值改变为我们输入的input值
3,在控制台界面查看修改以后的PI
可能会有点疑惑,PI的值明明在运行过程中已经改为了input的值,最后输出的PI仍然是3.14。实际上出现这种问题是因为编译器的优化措施导致的,在编译的时候
const float PI=3.14
就会将程序文件中的PI值全部都替换成3.14,就像C中的宏定义一样,而如果换下面的语句
则会输出改变后的PI值了
二,const指针
引入问题
下面去改正这个问题。
两种const指针
1,const关键字之后有*符号
改正上面错误以后的语句如下:
或者
这两个语句中*符号都在const符号之后,他们的意思一样,都是指p指针指向的内容不可以发生修改,但是p指针本身的值可以发生改变,例如:
p[0]='a';//会报错,因为P指针指向的内容不可修改
p=nullptr;//正确,可以修改p指针本身的值
2,const关键字之前有*符号
该指针的书写方式如下:
该指针的功能为可以修改指针指向的内容,但是不可以修改指针本身的值,可以看下面的例子。
char CharBuf[32] = "hello,world!";
char* const p = CharBuf;
p[0] = 'D';//编译通过,说明该指针可以修改指针指向的内容
p = nullptr;//编译失败,说明不可以修改指针本身的值
3,const关键字之前与之后都有*符号
该指针的功能为——指针指向的内容与指针本身都不可以修改。例如:
char CharBuf[32] = "hello,world!";
const char* const p = CharBuf;
p[0] = 'D';//报错,不可以修改指针指向的内容
p = nullptr;//报错,不可以修改指针本身的值
编个口诀记忆这两种指针
”康心内容,心康本身“
——如果是
const *
的顺序,是指指针指向的内容不可修改,如果是
*const
的顺序,是指指针本身不可修改。
三,如何将const指针转换为普通类型的指针——const_cast
看下面语句
const int n=3;
int *p=&n;//会报错,因为&n是const int *类型的,不可以直接转换为int*类型
因此,现在面临的问题是将
const int *
类型的指针,转换为int类型——可以使用强制类型转换**
同样的功能,还有另外一种方法——使用const_cast;
const_cast会去掉
const int *
类型当中的const属性,虽然强制性类型转换能够达到同样的效果,但是推荐使用const_cast方法,因为该方法可读性更好,作用更加明确,这在开发中是很重要的。