本节总结与const关键字相关的C++学习知识及面试题,一起来看看吧~
static关键字C++学习——static关键字-CSDN博客
new、delete关键字C++学习——new delete关键字-CSDN博客
其它关键字C++学习——sizeof、ertern、volatile等其它关键字-CSDN博客
一、const关键字
在标准C++中,const定义的是一个常量,用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。
二、const关键字的作用
(1)定义一个只读变量、常量或常对象,被const修饰会受到强制保护,定义时通常需要进行初始化。
C语言:const修饰是只读变量,本质还是变量
C++语言:const修饰的是真正意义上的常量,值在编译期就已经确定。
(2)修饰函数的返回值和形参;
在一个函数声明中,const可以修饰形参,在函数内部不能改变其值。
对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量,类的常对象只能访问类的常成员函数,且有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。
三、注意事项
1、const类型可以通过类型转换符const_cast转换为非const类型。
2、对于函数值传递的情况,由于参数传递是通过拷贝实参创建一个临时变量传递进函数的,函数内只会改变临时变量,但无法改变实参,此时无论加不加const对实参不会产生任何影响。
引用或指针传递函数调用中,函数内部可以改变引用或指针所指向的变量,这时const 才是实实在在地保护了实参变量。
四、指针与const
常量指针是指定义了一个指针,这个指针指向一个只读的对象,不能通过常量指针来改变这个对象的值。常量指针强调的是指针对其所指对象的不可改变性
指针常量是指定义了一个指针,这个指针的值只能在定义时初始化,其他地方不能改变。指针常量强调的是指针的不可改变性
五、const和#define的异同
同:const和#define都可以定义常量。
C中是使用宏#define定义, C++使用const来定义。
异:
(1)const 常量有数据类型,在编译、链接过程中起作用,只有一个拷贝,编译器可以对其进行类型安全检查;
#define定义的宏常量没有数据类型,在预处理阶段起作用,进行字符替换,替换可能会产生意料不到的错误。可能有多个拷贝,没有类型安全检查。
有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。
(2)#define预处理后占用代码段空间,const占用数据段空间;
(3)const不能重定义,而#define可以通过#undef取消某个符号的定义,进行重定义;
(4)#define独特功能可以用来防止文件重复引用。
(5)#define定义的常量是不可以用指针去指向,const定义的常量可以用指针去指向该常量的地址
(6)#define可以定义简单的函数,const不可以定义函数
六、C中const 能定义真正意义上的常量吗?
答:不能。
C中const并非是真正的常量,它仅仅是从编译层限定不允许对const变量进行赋值操作,可以通过指针对const变量进行修改。
注:c语言中只有enum可以实现真正的常量。
C++编译时会把const常量加入符号表,遇到此变量会从符号表中查找,所以在C++中是不可能修改到const变量的。
const成员变量只能在初始化列表中进行初始化。