目录
实验目的
掌握C++中const关键字的使用
实验内容
在C++中,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。
const关键字的使用将大大提高程序的健壮性。
1、const定义常量
2、使用const而非宏常量,便于进行类型安全检查
因为宏常量没有类型,而是在编译前即预编译阶段进行字符替换,没有类型安全检查,系统也不会为它分配内存;而使用const定义的常量则是一种标识符,会在编译前进行严格的类型检验,同时系统也会会常量分配内存
在上面这个例子中,第11行输出Pi,会在预编译阶段把Pi进行字符串替换,变为3.14
所以使用const而非宏常量会更加安全
3、在函数中使用,保护被修饰的东西,防止被意外修改
比如在上述函数中,把形参定义为const,那它就不能再被修改,增强程序的健壮性
4、节省空间,提高效率
相比宏常量,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中可以有着若干拷贝
如下:
#difine PI=3.14
const double pi=3.14
double x1=pi;//此时为pi分配内存,之后不再分配
double x2=PI;//编译期间进行宏替换,分配内存
double x3=pi;//不分配内存
double x4=PI;//再进行宏替换,再分配内存
此外,编译器通常不为普通const常量分配内存,而是将他们存储在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,提高了效率
5、指针使用const
int* const p1;
p1本身指向的地址不能改变
但对应内存单元上的值可以被改变,既可以通过改变a[1]的值也可以通过改变*p1的值,他们本质上是同一个值
const int* p1;
p1本身指向的值不能改变
但可以通过改变a[1]的值来改变p1指向的内存单元上的值
const int* const p1
p1本身的地址和它指向的值都不能改变,但是可以通过改变a[1]的值来改变它指向的值
函数参数为引用使用const
可以在函数参数为引用时使用const,这样既可以增加效率也可以避免被修改;
void function(const Class& Var); //引用参数在函数内不可以改变;
void function(const TYPE& Var); //引用参数在函数内为常量不可变;
这样的一个const引用传递和最普通的函数按值传递的效果是一模一样的,他禁止对引用的对象的一切修改,唯一不同的是按值传递会先建立一个类对象的副本, 然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效.另外只有引用的const传递可以传递一个临时对象,因为临时对象都是const属性, 且是不可见的,他短时间存在一个局部域中,所以不能使用指针,只有引用的const传递能够捕捉到这个家伙.
类相关const
通过const修饰类的成员变量:那么这个成员变量只能在类中被初始化,之后不能被修改;
通过const修饰成员函数:那么这个成员函数只能被const类对象调用,而且这个const类对象不能调用普通成员函数;const成员函数不能修改类的成员变量
将const类型转换为非const
采用const_cast 进行转换。
用法:
const_cast<类型> (expression)
非必要情况不要使用
实验总结
要理解const的概念,学会使用const关键字来提高程序的安全性和效率,但也不能盲目使用