条款28:避免返回handles指向对象内部成分
先看代码
class data{ private: int a; public: int& getA(){ return a; } data(int n):a(n){} }; int main(){ data d(2); d.getA() = 1; cout<<d.getA()<<endl; return 0; }
理论上,作为私有变量a不应该在类外被修改,但是在这里,却通过getA成功的修改了类内的变量,这样做是不正确的!
类似的我们将引用,指针和迭代器称之为handle,因为他们都可以用来操纵类内的私有数据。直接返回handle是不科学的。
为了阻止通过handle来修改变量,可以在返回值前面加上const
const int& getA(){ return a; }
但是经过修改的代码仍然存在问题。如果handle所指向对象的生存周期小于handle的生存周期,可能会造成空指针。例如下面的代码
class data{ private: int a; public: const int& getA(){ return a; } data(int n):a(n){} }; data& func(){ data tmp(10); return tmp; } int main(){ const int* res = &func().getA(); cout<<*res<<endl; return 0; }
因为tmp的生命周期在func之后就结束了,但是此时却依然在使用handle来调用tmp内部的变量,这样会导致错误