接上篇:C++57个入门知识点_02_const常量限制(解决C中define无法指明数据类型问题、常量一旦定义生命周期内不可修改、编译器在程序编译时期做的检查、编译时不确定的,才可以通过指针修改运行时的值),本篇介绍const很常见的应用,修饰指针时会对指针带来什么影响以及如何去除const修饰?
总结放于前:
1. const指针性质
:
(1)const指针书写形式:const TYPE*/TYPE const* 指针指向的内容时无法改变的,指针本身的值是可以修改的
(2)TYPE* const表示该指针是一个常量,意味指针本身的值不能被修改,但是指针指向的内容是可以修改的
(3)TYPE const* const表示指针指向的内容及指针本身均不能改变
2. 转换运算符const_cast专门用于去除const修饰
。
黑马总结:
const int *p; //const修饰*p
可以修改 p
不可以修改 *p。
int const *p; //const修饰*p
同上。
int * const p;
可以修改 *p
不可以修改 p。
const int *const p;
不可以修改 p。
不可以修改 *p。
总结:const 向右修饰,被修饰的部分即为只读。
常用:在函数形参内,用来限制指针所对应的内存空间为只读。-防止常量被修改
1. const指针
首先看一段代码:这一段代码看上去是没啥问题,但是编译器会报错
#include <iostream>
int main(int nArgc, char* pArgv[])
{
char* p = "Hello world";
p[0] = 'a';
return 0;
}
报错结果如下:因为编译器中"Hello world"
被看做常量,被放到一个只能读不能写的内存中,const char*
不能转换为char*
1.1 const TYPE*写法
为了避免在程序编写中犯上面的错误,使用const
修饰char*
,明确其指向的是常量,此时再看结果。
#include <iostream>
int main(int nArgc, char* pArgv[])
{
const char* p = "Hello world";
p[0] = 'a';
return 0;
}
运行结果:由于常量可读不可写,因此无法修改
1.2 TYPE const* 写法
const用来修饰指针还有另外一种写法:
char const* p 2= "Hello world";
#include <iostream>
int main(int nArgc, char* pArgv[])
{
const char* p = "Hello world";
char const*p2 = "Hello world";
p[0] = 'a';
p[2] = 'b';
return 0;
}
结果与上一致:
这两种写法有什么性质呢?
const TYPE*/TYPE const* 指针指向的内容时无法改变的,指针本身的值是可以修改的
。
#include <iostream>
int main(int nArgc, char* pArgv[])
{
const char* p = "Hello world";
char const*p2 = "Hello world";
char* p3=nullptr;
p = p3 ;
return 0;
}
运行结果:
1.3 TYPE* const的性质
TYPE* const
表示该指针是一个常量,意味指针本身的值不能被修改,但是指针指向的内容是可以修改的(TYPE*
修饰指针指向的内容的数据类型为TYPE
,const
是用来修饰指针的)
#include <iostream>
int main(int nArgc, char* pArgv[])
{
char szBuf[256] = "Hello world";
char* const p = szBuf;
p[0] = 'A';
p = nullptr;
return 0;
}
运行结果:
1.4 TYPE const* 性质
C++57个入门知识点_40 常成员函数(用于定义不可修改类内部成员变量的函数,一般用来修饰Get函数;常成员函数this指针:const T* const;常成员函数内部变量修改方法:强转/关键字)中会用到。
TYPE const* const
表示指针指向的内容及指针本身均不能改变(TYPE const*
修饰指针指向的内容,const
修饰指针)。
#include <iostream>
int main(int nArgc, char* pArgv[])
{
char szBuf[256] = "Hello world";
char const* const p = szBuf;
p[0] = 'A';
p = nullptr;
return 0;
}
运行结果:
2. 转换运算符const_cast
以下代码中由于p为int*类型,&n为const int 两者是无法转换的
#include <iostream>
int main(int nArgc, char* pArgv[])
{
const int n = 5;
int* p = &n;
return 0;
}
运行结果:
解决上面问题的一种方式是强转:
#include <iostream>
int main(int nArgc, char* pArgv[])
{
const int n = 5;
int* p = (int*)&n;
return 0;
}
另外一种方法是使用转换运算符const_cast去除const属性:
#include <iostream>
int main(int nArgc, char* pArgv[])
{
const int n = 5;
int* p4 = const_cast<int*>(&n);
*p4 = 1;
return 0;
}
强转和使用转换运算符const_cast有什么区别呢?
强转可以转换为任意类型,const_cast是只能转换const修饰的常量,语义更加明显
。
3. 学习视频地址:C++57个入门知识点_03_ const指针