`
暴风雪
  • 浏览: 376939 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

《Effective C艹》读书笔记(19)

    博客分类:
  • C艹
 
阅读更多

条款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内部的变量,这样会导致错误

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics