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 }


原文地址:https://www.cnblogs.com/joyeecheung/p/2957969.html