﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-海屋-随笔分类-技术概念</title><link>http://www.cppblog.com/seahouse/category/17337.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 23 Jul 2011 04:22:21 GMT</lastBuildDate><pubDate>Sat, 23 Jul 2011 04:22:21 GMT</pubDate><ttl>60</ttl><item><title>mutalbe关键字</title><link>http://www.cppblog.com/seahouse/archive/2011/07/21/151534.html</link><dc:creator>seahouse</dc:creator><author>seahouse</author><pubDate>Thu, 21 Jul 2011 03:15:00 GMT</pubDate><guid>http://www.cppblog.com/seahouse/archive/2011/07/21/151534.html</guid><wfw:comment>http://www.cppblog.com/seahouse/comments/151534.html</wfw:comment><comments>http://www.cppblog.com/seahouse/archive/2011/07/21/151534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/seahouse/comments/commentRss/151534.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/seahouse/services/trackbacks/151534.html</trackback:ping><description><![CDATA[原文：<a href="http://dev.yesky.com/393/3007393.shtml">http://dev.yesky.com/393/3007393.shtml</a><br /><br /><br /><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 24px; font-family: Arial, 宋体; font-size: 14px" class="Apple-style-span">mutalbe的中文意思是&#8220;可变的，易变的&#8221;，跟constant（既C++中的const）是反义词。<br /><br />　　在C++中，mutable也是为了突破const的限制而设置的。被mutable修饰的变量，将永远处于可变的状态，即使在一个const函数中。<br /><br />　　我们知道，如果类的成员函数不会改变对象的状态，那么这个成员函数一般会声明成const的。但是，有些时候，我们需要在const的函数里面修改一些跟类状态无关的数据成员，那么这个数据成员就应该被mutalbe来修饰。<br /><br />　　下面是一个小例子：<span class="Apple-converted-space">&nbsp;</span><br /><br />
<table style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" border="1" bordercolor="#cccccc" width="90%" bgcolor="#e7e9e9" align="center">
<tbody>
<tr style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">
<td style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">class ClxTest<br />{<br />　public:<br />　　void Output() const;<br />};<br /><br />void ClxTest::Output() const<br />{<br />　cout &lt;&lt; "Output for test!" &lt;&lt; endl;<br />}<br /><br />void OutputTest(const ClxTest&amp; lx)<br />{<br />　lx.Output();<br />}</td></tr></tbody></table><br />　　类ClxTest的成员函数Output是用来输出的，不会修改类的状态，所以被声明为const的。<br /><br />　　函数OutputTest也是用来输出的，里面调用了对象lx的Output输出方法，为了防止在函数中调用其他成员函数修改任何成员变量，所以参数也被const修饰。<br /><br />　　如果现在，我们要增添一个功能：计算每个对象的输出次数。如果用来计数的变量是普通的变量的话，那么在const成员函数Output里面是不能修改该变量的值的；而该变量跟对象的状态无关，所以应该为了修改该变量而去掉Output的const属性。这个时候，就该我们的mutable出场了&#8212;&#8212;只要用mutalbe来修饰这个变量，所有问题就迎刃而解了。<br /><br />　　下面是修改过的代码：<br /><br />
<table style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" border="1" bordercolor="#cccccc" width="90%" bgcolor="#e7e9e9" align="center">
<tbody>
<tr style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">
<td style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">class ClxTest<br />{<br />　public:<br />　　ClxTest();<br />　　~ClxTest();<br /><br />　　void Output() const;<br />　　int GetOutputTimes() const;<br /><br />　private:<br />　　mutable int m_iTimes;<br />};<br /><br />ClxTest::ClxTest()<br />{<br />　m_iTimes = 0;<br />}<br /><br />ClxTest::~ClxTest()<br />{}<br /><br />void ClxTest::Output() const<br />{<br />　cout &lt;&lt; "Output for test!" &lt;&lt; endl;<br />　m_iTimes++;<br />}<br /><br />int ClxTest::GetOutputTimes() const<br />{<br />　return m_iTimes;<br />}<br /><br />void OutputTest(const ClxTest&amp; lx)<br />{<br />　cout &lt;&lt; lx.GetOutputTimes() &lt;&lt; endl;<br />　lx.Output();<br />　cout &lt;&lt; lx.GetOutputTimes() &lt;&lt; endl;<br />}</td></tr></tbody></table><br />　　计数器m_iTimes被mutable修饰，那么它就可以突破const的限制，在被const修饰的函数里面也能被修改。</span></span><img src ="http://www.cppblog.com/seahouse/aggbug/151534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/seahouse/" target="_blank">seahouse</a> 2011-07-21 11:15 <a href="http://www.cppblog.com/seahouse/archive/2011/07/21/151534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可重入函数（reentrant function）</title><link>http://www.cppblog.com/seahouse/archive/2011/07/18/151279.html</link><dc:creator>seahouse</dc:creator><author>seahouse</author><pubDate>Mon, 18 Jul 2011 01:56:00 GMT</pubDate><guid>http://www.cppblog.com/seahouse/archive/2011/07/18/151279.html</guid><wfw:comment>http://www.cppblog.com/seahouse/comments/151279.html</wfw:comment><comments>http://www.cppblog.com/seahouse/archive/2011/07/18/151279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/seahouse/comments/commentRss/151279.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/seahouse/services/trackbacks/151279.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 若要写可重入性函数的做法通常是我们在函数中只修改局部变量，而不改变全局变量，或尽量不使用全局变量、静态static变量。<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/seahouse/archive/2011/07/18/151279.html'>阅读全文</a><img src ="http://www.cppblog.com/seahouse/aggbug/151279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/seahouse/" target="_blank">seahouse</a> 2011-07-18 09:56 <a href="http://www.cppblog.com/seahouse/archive/2011/07/18/151279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>