C++陷阱之四(未正确使用 常函数 带来的麻烦)

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++程序员,一定要对自己的代码负责,要争取写出标准简洁大气的程序,当成员函数不修改成员变量时一定要把它设置为常函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值