zoukankan      html  css  js  c++  java
  • sicily 7671. AutoReset

    Description

    “ 只要我离开了你的世界,无论你做过什么,我都能忘记你回到从前!”小PY今天很小清新的,大家不要说他腹黑啊。他知道今天大家都学习了析构函数!现在请大 家帮他实现一个类AutoReset,这个类的功能是在一个作用域开始的时候,保存某个变量的值,而当该作用域结束的时候能够实现变量值的Reset。比 如以下这个例子:

    实现下面这个类:

    class AutoReset {
     public:
      AutoReset(int *scoped_variable, int new_value);
      ~AutoReset();
     
     private:
      int *scoped_variable_;
      int original_value;
    };
    Hint

     仔细体味小PY说的话!

    课外知识

    在这里我们实现的这个类体现了C++编程中一个常用的技巧,RAII:Wiki。 嗯,好像很高端的样子。简单地讲:利用析构函数做资源的回收。RAII 指的是这样一种技术:当类对象不在域(go out of scope)中时,就调用类的析构函数。析构函数然后会释放所有由该对象所申请的资源。RAII 通常用于很紧缺的资源,或那些在被释放时必须要有可预测点(predictable point)的资源。我们这里这个类只是一个简单的例子而已。

    我又来蹭题做了口桀口桀,Juan教得有点慢……

    看到中文的题目反而有点不适应,析构函数原来就是destructor……

    注释了一下这道题的原理

    View Code
     1 class AutoReset {
     2 public:
     3     AutoReset( int *scoped_variable, int new_value );
     4     ~AutoReset();
     5  
     6 private:
     7     int *scoped_variable_;
     8     int original_value;
     9 };
    10 
    11  
    12 AutoReset::AutoReset( int *scoped_variable, int new_value )
    13 {
    14     // 将scoped_variable这个指针中的值,即value的原值,保存在original_value里,以待将来恢复
    15     original_value = *scoped_variable; 
    16     // value的地址是作为参数(scoped_variable)传下来的,所以一旦离开构造函数,就没办法直接得知value的地址了 
    17     // 因此要将scoped_variable这个指针所指向的地址,即value的地址,保存在成员scoped_variable_里,
    18     // 留待将来恢复value的值时使用 
    19     scoped_variable_ = scoped_variable;
    20     // 将new_value通过scoped_variable_这个指针(指向外面的value)赋给value,达到
    21     // 在作用域内value的值修改为 new_value的作用,于是花括号内的value就成了样例中的1234 
    22     *scoped_variable = new_value;
    23 }
    24 
    25 AutoReset::~AutoReset()
    26 {
    27     // 当离开作用域的时候,调用析构函数,这时通过之前保存的指针scoped_variable_(指向外面的value)
    28     // 把之前保存的value的原值(original_value = 100)赋还给value,于是花括号外的value又变回了100 
    29     *scoped_variable_ = original_value;
    30 }


  • 相关阅读:
    如何查看MySQL执行的每条SQL
    最简单的方式在linux上升级node.js版本
    快速理解字符串和编码
    macaca常见错误排查
    macaca自动化初体验
    F2eTest程序快捷方式安装到桌面
    centos下mysqlreport安装和使用
    前端纯css 图片的模糊处理
    gulp入门学习教程(入门学习记录)
    关于nodejs中npm命令没有反应的解决方法
  • 原文地址:https://www.cnblogs.com/joyeecheung/p/2957969.html
Copyright © 2011-2022 走看看