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 }