避免返回handles指向对象内部成分
有这样一个类,用左上角和右下角的坐标表示一个矩形:
class point { public: point(int a,int b):x(a),y(b){} point& changeX(int _x) { point newpoint(_x, y); return newpoint; } private: int x; int y; }; struct Pdata { point left; point right; }; class Rectangle { public: Rectangle(point a,point b):x(a),y(b){} public: point& left() const { return pdata->left; } point& right() const { return pdata->right; } point& setX(int x) const { point newpoint = pdata->left; return newpoint.changeX(x); } private: shared_ptr<Pdata> pdata; point x; point y; };
现在把点的数据进行修改:
int main() { point a(1, 2); point b(3, 4); const Rectangle rec(a, b); rec.left().changeX(0); }
会出现什么问题?
因为left()的调用者能够使用被返回的引用来更改成员。但是rec应该是不可变的。所以返回引用的时候一定要注意调用者是否会修改本不应该修改的数据。
解决方案:
const point& left() const { return pdata->left; } const point& right() const { return pdata->right; }
加上const
总结:
1.返回引用前确保该数据是存在可以被修改的可能性的并且不会导致程序或者数据错误。
2.如果待引用返回的数据在出了函数作用域前就被销毁了,那么程序会引发崩溃。
3.引用返回要三思而后行。但是不代表不能使用,比如operator[] 在vector或者string等中就需要引用返回。