一.Const常量
1.作用
Const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的
用来提高程序的安全性和可靠性(其实我一般都觉得可加可不加,但是加了代码当然更好啦)
它推出的初始目的是为了取代预编译指令,因为const定义的常量在程序运行中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝
非Const类型可以赋值给Const类型,而Const类型不能赋值给非Const类型
Const修饰的数据类型必须赋初值
2.修饰内置类型变量
//(1)基本类型
int A; //变量
const int a=1; //常量
a=2; //错误,常量不可变
int const b=2; //常量
b=3; //错误,常量不可变
//(2)指针判断const在*左边还是右边结合
const int* p=&A; //常量数据,变量指针
int const* p=&A; //常量数据,变量指针
p=&a; //正确,变量指针可以变
*p=a; //错误,常量数据不能变
int* const p=&A; //变量数据,常量指针
p=&a; //错误,常量指针不能变
*p=a; //正确,变量数据可以变
const int* const a=&A; //常量数据,常量指针
a=&a; //错误
*a=a; //错误
3.修饰函数参数
//值传递
void A(const int a){ //因为是两块不同的内存,只能锁定函数内的参数变量内存无法修改
a=3; //错误,无法进行修改
}
//引用传递
void A(const int& a){ //引用的原来的数据内存,该内存的值不能变
a=3; //错误,无法进行修改
}
//指针传递
void A(const int* a){ //指向的数据不能变,表明该指针无法修改指向内存的值
int b=1;
a=&b; //正确,传递进来的指针变量可以变
*a=2; //错误,传递进来的指针变量所指向的值不能变
}
//注意:指针传递的本质也是值传递,任何对形参的指针变量的改变都不会影响到实参的指针变量,只有对形参的指针变量所指向的内存进行修改,才会影响到实参的指针变量所指向的内存
void A(int* const a){
int b=1;
a=&b; //错误,传递进来的指针变量不能变
*a=2; //正确,传递进来的指针变量所指向的值不能变
}
4.修饰返回值
//值传递
const int a(){} //无意义,返回值加上常量对形参和实参并不会有任何作用和改变
//引用传递
const int& a(){} //会报警告,不建议这么写
//指针传递
const int* A(const int* p){ //用常量指针做返回值,用来接收的指针也必须是常量指针
return p;
}
int B(){
int data=5;
const int* p=&data;
p=A(p); //返回常量指针
}
int* const A(){...} //无意义,这么写对形参和实参并不会有任何作用和改变
//因为指针变量被返回之后,自身的改变已经无意义,重要的是它指向的内存是不是常量
//注意,非成员函数不允许用const修饰函数
int* A()const{...} //错误,普通函数不能用const进行限定
//注意,const int*无法转换为int*,常量指针无法转换为变量指针
//但是,int*可以转换为const int*,变量指针可以转换为常量指针
5.修饰成员函数
注意:const修饰成员函数这个功能只有在C++有
int A() const{} //错误,普通函数无法加上限定符,只能修饰成员函数
class A{
public:
//对调用的成员变量和成员函数进行限定
//const修饰的成员函数不能修改任何成员变量(除了mutable修饰的变量)
//const修饰的成员函数不能调用非const成员函数,因为非const成员函数会修改成员变量
void a()const;
};