常函数:类中的成员
函数参数列表后面有const修饰
时,称之为常函数,其主要
作用是为了能够保护类中的成员变量、限制修改。其实可以理解为把 (类*const this)变为(类 const* const this)
常函数的定义方式:
在()之后, { 之前加个const关键字
void fun()const{}
特性:
1.不能修改类中的非静态成员,因为
const
修饰
this
指针变为
const 类* const this
,也就是执行
this->变量=val 操作是非法的
,
不可以修改
成员变量但
可以查看
成员变量。
对于
静态成员属性不但能查看,也能对其修改
,因为静态成员不是属于对象的,并不在
const
约束范围内。
2.在
常函数中
可以查看普通的变量、常量、静态变量等,也
可以调用其他
常函数
,但是却
不能调用普通的成员函数
,因为其this
指针的类型并不相同,普通成员函数
CTest* const this
,常函数
const CTest* const this ,
将const CTest* const this 转换成 CTest* const this
这是指针
安全级别降级的非法操作
。
3.但在普通的成员函数中却是可以调用常函数的,
将CTest* const this 转换成 const CTest* const this
t
这是一个指针安全级别升级的合法操作。
4.如果在常函数中想修改部分指定的普通成员,我们可以使用关键字
mutable
来修饰该成员。
class CTest{
int m_a;
mutable int m_b;
void c1()const{
//m_a = 10; //非法
m_b = 20; //合法
}
};
常量成员函数的重载:
两个成员函数,名字和参数都一样,但是一个时const,一个不是,算是重载,不是重定义。
非常对象既可以调用非常成员函数也可以调用常成员函数优先调用非常成员函数。
class ctest
{
private:
int n;
public:
ctest() {n=1;}
//函数重载
int getvalue() const{return n;}
int getvalue(){return n*2;}
};
int main()
{
const ctest objtest1;//常量对象
ctest objtest2;//普通对象
cout<<objtest1.getvalue()<<endl;//1 调用的int getvalue() const{return n;}
cout<<objtest2.getvalue()<<endl;//2 调用的int getvalue(){return n*2;}
return 0;
}