常成员函数
格式:返回值 函数名(形参表) const {函数体} 例如:void fun(int a) const { }
特点:
- 可以读数据成员(只读),不能进行修改,对函数的功能有更明确的确定
- 常成员函数不能用来更新类的任何成员变量,也不能调用类中未用const修饰的成员函数,智能用来调用常成员函数。即常成员函数不能修改类中的成员状态,与const语义相符合
- 常函数能修改传入自身的形参以及内部定义的局部变量
- 常对象只能调用常函数,不能调用普通函数
#include<iostream>
using namespace std;
class A {
public:
int a;
int b;
mutable int c;
static void fun() {}
void fun1() const {//常函数不能修改成员变量,常函数中成员变量是只读的
cout << this->a << endl;
c = 5;
}
void fun1() {}//常函数可以和非常函数发生重载
void work() {}//常函数不能调用类内的非常函数,因为非常函数有this指针可以修改成员变量
void fun2(int a);
};
void A::fun2(int a) {
a = 5;//常函数中的参数可以修改
this->c = 4;//如果要在常函数中修改成员变量,需要在该成员变量前加上mutable,常对象对成员变量修改同理
}
int main() {
const A a;//常对象不能调用普通的成员函数,可以调用静态成员函数(因为静态成员函数没有this指针,不能修改成员变量)
a.fun1();
a.fun();//常函数和非常函数发生重载的时候,常对象默认调用常函数
//a.work();常对象不能调用非常函数
}
值得注意的是:
- 常对象不能调用非常函数,但是可以调用静态成员函数,也可以调用常函数。因为静态成员函数(没有this指针)和常函数都不能修改成员变量
- 常对象或者常函数需要修改成员变量 需要在成员变量前加一个关键字mutable
- 常函数和非常函数可以发生重载,常对象在调用的时候默认调用常函数,非常对象在调用的时候默认调用非常函数,非常对象可以调用常函数
- 函数声明和实现分离时 const是函数声明的一部分,在函数的实现部分也要加上const,也就是在类内声明 void fun(int a) const;在类外实现就应该写成void A :: fun(int a) const{}
- 常函数和常函数之间可以发生重载
意义:
在实现只读作用的函数中,可以防止程序员不小心修改了成员变量的值