C++里允许在一个成员函数形参列表的括号后面加上const关键字让这个函数成为常函数,所谓的常函数,就是把这个函数传来的this指针常量(例:Person* const this)转变为常指针常量(const Person* const this),从而在常函数里只能对成员变量进行读操作而无法修改。一个好的C++程序员会将不修改成员变量的函数写成常函数,既能提高代码标准性,同时能避免一些麻烦的产生。
看一下下面的代码,能正常输出吗?不能的原因在哪里
#include<iostream>
using namespace std;
class Person{
public:
Person(int height,int weight):m_height(height),m_weight(weight){}
int getHeight(){
return m_height;
}
int getWeight(){
return m_weight;
}
Person operator+ (const Person& p){
return Person(m_height+p.getHeight() , m_weight+p.getWeight());
}
private:
int m_height;
int m_weight;
};
void test01(){
Person p1(10,10);
Person p2(20,20);
Person p3 = p1+p2;
cout<<p3.getHeight()<<endl;
cout<<p3.getWeight()<<endl;
}
int main(){
test01();
system("pause");
return 0;
}
Person类里定义了获取高度和重量的成员函数,这两个函数只是把成员变量作返回,并没有对其修改,然而这里却并没有将这两个函数设置为常函数,埋留下了安全隐患,当定义了一个常对象时就无法调用这两个函数了。这段代码的常对象在哪里? 就在第13行,我们通常为了效率和节省空间大小常采用pass by reference传递参数,但是为了避免对其修改,我们就在形参前加上了const,让其变为了常对象,于是问题就出现了。。解决方法就是把这两个获取高度和重量的函数设置为常函数。
int getHeight()const{
return m_height;
}
int getWeight()const{
return m_weight;
}
同样,我们自己写的类不一定是自己在使用,也可能有其他的人使用,其他人不会关心这个类的内部实现,当他们通过我们的类创建一个常对象时,却发现本该能够调用的成员函数(不会修改成员变量的函数)却不能调用,问题可能就出现在类的设计者没有正确的把这些函数设置为常函数,而使用者并不知道。
所以,为了成为一名优秀的C++程序员,一定要对自己的代码负责,要争取写出标准简洁大气的程序,当成员函数不修改成员变量时一定要把它设置为常函数。