成员函数后加 const
- 非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为const指针,这个函数是不能改变类的成员变量的(因为隐含了对this指针的const引用);唯一的例外是对于mutable修饰的成员。
- 加了const的成员函数可以被非const对象和const对象调用,但不加const的成员函数只能被非const对象调用。
- 一般对于不需修改操作的成员函数尽量声明为const成员函数,以防止产生const对象无法调用该成员函数的问题,同时保持逻辑的清晰。
#include <iostream>
using namespace std;
class aa{
int num;
public:
aa(){
int b = 10;
num = b;
};
void out1(){
cout<<num<<endl;
}
void out2() const{
cout<<num<<endl;
}
void out3() const {
num+=10; //出错,const函数不能修改其数据成员,删掉const可正常编译
cout<<num<<endl;
}
};
int main()
{
aa a1;
a1.out1();
a1.out2();
a1.out3();
const aa a2;
// a2.out1(); // 错误,const的成员 不能访问非const的函数
a2.out2();
// a2.out3();
return 0;
}
mutable关键字
关键字mutable是C++中一个不常用的关键字,只能用于类的非静态和非常量数据成员。
如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员。但是有些时候需要在该类函数中对类的数据成员进行赋值,这个时候就需要用到mutable关键字了。
#include <iostream>
using namespace std;
class A{
mutable int num1;
int num2;
public:
A(): num1(1), num2(2){} // 构造函数,初始化
void func() const { // 加了const的成员函数可以被非const对象和const对象调用
num1 += 10; // const函数不能修改其数据成员(用mutable修饰的变量除外)
// num2 += 5; // 错误
cout<< num1 <<endl;
}
void fun(){
num1 += 5;
num2 += 5;
cout << num1 << endl;
cout << num2 << endl;
}
};
int main()
{
A a1;
a1.func(); // num1 = 1 + 10
a1.fun(); // num1 = 11 + 5, num2 = 2 + 5
const A a2; // const的成员只能访问加const的函数
a2.func(); // num1 = 1 + 10
// a2.fun(); // fun() 未加const,编译错误
return 0;
}
参考链接:
https://www.cnblogs.com/xing901022/p/3413019.html
https://blog.csdn.net/anye3000/article/details/6618615
https://www.cnblogs.com/llxblogs/p/7709509.html