一、常函数
C++的类中,在函数定义的形参列表后加上const关键字,可以将函数修饰为常函数。写法如下:
class Test{
public :
int fun1(int a, int b) const { // 这是一个常函数
return (a + b);
}
};
常函数中,是不可以修改成员变量的值的,但可以使用。
解释:this关键字本质上是一个 (Test const *)类型的指针常量,其特性是不可以改变指针的指向,这也是为什么this可以根据每个对象指向各自的成员。而将函数声明为常函数,本质上就是相当于在this的类型前加了const修饰,this在常函数中变成了(const Test const *)类型,变成了常量指针常量。此时,this不仅不能改变指向,同样也不可以改变指向空间的值,也就是无法改变this->某一变量。
class Test{
public :
int x;
Test(int a) : x(a) {}
int fun1(int a, int b) const { // 这是一个常函数
//this->x = 666; 这条语句是错误的
return (a + b + this->x); // 这条语句是正确的
}
};
但在使用mutable关键字声明某一成员变量后,常函数就可以改变它的值了。例子如下:
class Test{
public :
mutable int x; //用mutable关键字后,此变量可以被常函数修改
Test(int a) : x(a) {}
int fun1(int a, int b) const { // 这是一个常函数
this->x = 666; //由于x被mutable声明,此语句正确
return (a + b + this->x);
}
};
二、常对象
C++类在实例化对象时,如果加上const修饰,那这个对象被称为常对象。
常对象只能调用常函数,因为普通函数(不是常函数的函数)的函数体内部是可以修改普通成员变量值的,而常对象不允许修改不同成员值的,因此常对象不能调用普通函数。举例如下:
class Test{
public :
mutable int x; //用mutable关键字后,此变量可以被常函数修改
Test(int a) : x(a) {}
string fun2() {
return "Fun2!";
}
int fun1(int a, int b) const { // 这是一个常函数
this->x = 666; //由于x被mutable声明,此语句正确
return (a + b + this->x);
}
};
int main() {
const Test t0(222);
//cout << t0.fun2() << endl; 此语句错误,因为常对象t0无法调用普通函数(不是常函数)fun2()
cout << t0.fun1(10, 10) << endl; //此语句正确,因为fun1()为常函数
return 0;
}
程序运行结果:
666 + 10 + 10 = 686,调用fun1()函数成功。