C++中,经常可以看到用const修饰变量,修饰函数。现在,我们对const进行总结(不必死记硬背)
1、const修饰变量: int a=3;//定义整型变量a
const int a=3;//表明a为常变量,a的值不能够被改变
2、const修饰引用
const int &b=a;//b与a的地址相同,不能通过b来改变a的值,例如:b=5(错误)
int const &b=a;//b与a的地址相同,不能通过b来改变a的值,例如:b=5(错误)
3、const修饰指针
const int *p=&a;//不能通过指针来改变a的值,例如:*p=5(错误)
int const *p=&a;//不能通过指针来改变a的值,例如:*p=5(错误)
int *const p=&a;//p的指向不能改变,例如:int b;p=&b(错误)
const int *const p=&a// 不能通过指针来改变a的值,同时p的指向不能改变;
const的意思是常量,因此,我们可以理解为“不变的”,上述情况,我们可以&或者*为界,看const距离谁近,const就修饰谁。例如:int *const p=&a;const距离p近,修饰指针p,表明指针p不能改变其指向。
4、const修饰函数(假设定义Test类,数据成员为data,成员函数为void show(Test *const p))
void show(Test *const p)const
表明该函数为常函数,在程序内部该函数相当于void show(Test *const this,const Test *const p),就是将函数外面的const拿到了第二个参数的前面(成员函数都默认含有第一个参数,即this指针)。该函数的参数表明:不能在函数内部更改指针p的指向,同时,也不能在函数内部通过指针p修改传递给形参的数据。下面定义Test类,讨论常函数和普通的成员函数之间的相互调用问题:
#include<iostream>
using namespace std;
class Test
{
public:
Test(int d)
{
data=d;
}
void show()const
{
}
void caculate()
{
}
private:
int data;
};
int main()
{
Test t1(10);
}
现在我们在show()函数的内部调用caculate()会提示有错误,原因是show( )函数是常函数,函数实际为show(const Test *const this),因此,此函数不希望修改data数据,但是caculate( )函数可能会修改data数据(本来不可以修改,但是最后可能会被修改),因此,会报错。相反,在caculate( )函数内部调用show( )函数,不会报错,原因在于caculate( Test *const this)表明可以修改data数据,而show(const Test *const this)表明不可以修改data数据(可以修改或不修改,但是最后保证其不修改)。