天天看点

C++易错知识点笔记(一)const关键字一,const常量二,const指针

一,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方法,因为该方法可读性更好,作用更加明确,这在开发中是很重要的。

继续阅读