什么是常量函数
在类成员函数声明的参数列表后加上const
关键字将函数声明为常量函数。
class A {
public:
void f() const {
print("Hello!");
}
}
注意:const
关键字位于函数声明的返回类型前时不是常量函数,只是函数的返回值为常量。
const int f1() {...} // 不是常量函数,函数的返回值为常量
int f2() const {...} // 常量函数
常量函数的特性
常量函数只能读取外部数据而无法修改。当函数较为复杂时,如果希望避免函数对对象内容进行修改,就可以将这个函数定义为常量函数。
class B {
private:
int n;
public:
void f() const {
n = 0; // 错误:表达式必须是可修改的左值
}
};
注意:
- 常量函数可以修改在其内部定义的变量。
- 常量函数内只能调用常量函数,不能调用非常量函数。
class C {
public:
int f1() const {
int n = 0;
n = 1; // 正确:常量函数可以修改在其内部定义的变量
return n;
}
intf2() {
return 2;
}
void f3() const {
int a;
a = f1(); // 正确
a = f2(); // 错误:常量函数内不能调用非常量函数
}
};
常量函数的调用规则
- 非常量对象可以调用常量函数和非常量函数。
- 常量对象可以调用常量函数,不可以调用非常量函数。
举例:
#include <iostream>
using namespace std;
class A {
public:
void f1() { cout << "f1" << endl; }
void f2() const { cout << "f2" << endl; }
};
int main() {
A a;
a.f1();
a.f2();
const A b;
b.f1(); // 错误:对象含有与成员函数"A::f1"不兼容的类型限定符
b.f2();
return 0;
}