﻿<?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++博客-键盘上的舞者-随笔分类-C/C++</title><link>http://www.cppblog.com/Marcky/category/10941.html</link><description>My Email: marckywu@gmail.com</description><language>zh-cn</language><lastBuildDate>Thu, 20 Aug 2009 11:33:25 GMT</lastBuildDate><pubDate>Thu, 20 Aug 2009 11:33:25 GMT</pubDate><ttl>60</ttl><item><title>安全访问数组的指针类模板</title><link>http://www.cppblog.com/Marcky/archive/2009/08/13/93233.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Thu, 13 Aug 2009 10:29:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/08/13/93233.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/93233.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/08/13/93233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/93233.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/93233.html</trackback:ping><description><![CDATA[在用数组作为数据结构存储数据的时候，一不小心就访问越界了，这类错误有时候很不容易发现。为此自己封装一个专门用来访问数组元素的指针类模板。此类模板需要数组的元素类型，起始地址，大小来构造一个安全的Ptr2T指针对象，此对象访问数组的方法不但与普通的指针相同，同时还增加了越界的安全检查。<br><span style="color: #000000;"></span><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdexcept</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;std;<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Ptr2T&nbsp;{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008000;">//</span><span style="color: #008000;">构造函数，形参为数组起始地址和大小</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T(T&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">p,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;size)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;m_p(p),&nbsp;m_array(p),&nbsp;m_size(size)&nbsp;{&nbsp;};<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">++</span><span style="color: #000000;">();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">前缀++</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Ptr2T&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">++</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">后缀++</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">--</span><span style="color: #000000;">();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">前缀--</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Ptr2T&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">--</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">后缀--</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">+=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n);<br>&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n);<br></span><span style="color: #008000;">//</span><span style="color: #008000;">安全的数组元素访问操作</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;T</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">*</span><span style="color: #000000;">()&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">;&nbsp;&nbsp;<br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">m_p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">访问数组的指针</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">m_array;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">保存数组的起始地址</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;m_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">保存数组的大小</span><span style="color: #008000;"><br></span><span style="color: #000000;">};<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>inline&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;&amp;</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">++</span><span style="color: #000000;">()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;m_p&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br>}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>inline&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">++</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T&nbsp;current&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">(</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">用重载的前缀++来实现</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;current;<br>}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>inline&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;&amp;</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">--</span><span style="color: #000000;">()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;m_p&nbsp;</span><span style="color: #000000;">-=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br>}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>inline&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">--</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T&nbsp;current&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">(</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">用重载的前缀--来实现</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;current;<br>}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>inline&nbsp;T</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">*</span><span style="color: #000000;">()&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;"><br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(m_p&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;m_array&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;m_p&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;m_array&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;m_size&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;{&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">越界检查</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;out_of_range(</span><span style="color: #000000;">"</span><span style="color: #000000;">out&nbsp;of&nbsp;range</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">m_p;<br>}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>inline&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;&amp;</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">+=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;m_p&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;n;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br>}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>inline&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;&amp;</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">-=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;m_p&nbsp;</span><span style="color: #000000;">-=</span><span style="color: #000000;">&nbsp;n;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br>}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">+</span><span style="color: #000000;">(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">p,&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(p)&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;n;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">用重载的+=来实现</span><span style="color: #008000;"><br></span><span style="color: #000000;">}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">+</span><span style="color: #000000;">(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n,&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">p)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;p&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;n;<br>}<br><br>template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">-</span><span style="color: #000000;">(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">p,&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(p)&nbsp;</span><span style="color: #000000;">-=</span><span style="color: #000000;">&nbsp;n;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">用重载的-=来实现</span><span style="color: #008000;"><br></span><span style="color: #000000;">}<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">使用方法</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;a[</span><span style="color: #000000;">5</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">'</span><span style="color: #000000;">a</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">b</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">c</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">d</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">e</span><span style="color: #000000;">'</span><span style="color: #000000;">};<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;b[</span><span style="color: #000000;">5</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">};&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;pc(a,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;Ptr2T</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;pi(b,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pc</span><span style="color: #000000;">++</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;pi</span><span style="color: #000000;">--</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;pi&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">(pi&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*++</span><span style="color: #000000;">pi&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pi&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br></span></div>
<br><img src ="http://www.cppblog.com/Marcky/aggbug/93233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-08-13 18:29 <a href="http://www.cppblog.com/Marcky/archive/2009/08/13/93233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>显示构造函数与转换运算符的合作</title><link>http://www.cppblog.com/Marcky/archive/2009/08/13/93193.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Thu, 13 Aug 2009 06:39:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/08/13/93193.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/93193.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/08/13/93193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/93193.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/93193.html</trackback:ping><description><![CDATA[在设计一个Date类的时候，我们使用int类型来表示年份，如果我们需要对年份进行一些特殊的操作（如：检查，保护等），就很需要定义一个Year类，如下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Year&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;m_y;<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008000;">//</span><span style="color: #008000;">explicit限制int到Year的隐式转换</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">explicit</span><span style="color: #000000;">&nbsp;Year(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;y(m_y)&nbsp;{&nbsp;}<br></span><span style="color: #008000;">//</span><span style="color: #008000;">Year到int的类型转换&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">()&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;m_y;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">other&nbsp;funtion<img src="http://www.cppblog.com/Images/dot.gif"></span><span style="color: #008000;"><br></span><span style="color: #000000;">}<br><br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Date&nbsp;{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;:<br>&nbsp;&nbsp;&nbsp;&nbsp;Date(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;d,&nbsp;Month&nbsp;m,&nbsp;Year&nbsp;y);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span style="color: #008000;"><br></span><span style="color: #000000;">};<br><br>Date&nbsp;d1(</span><span style="color: #000000;">1987</span><span style="color: #000000;">,&nbsp;feb,&nbsp;</span><span style="color: #000000;">21</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">error,&nbsp;21不能隐式转换为Year</span><span style="color: #008000;"><br></span><span style="color: #000000;">Date&nbsp;d2(</span><span style="color: #000000;">21</span><span style="color: #000000;">,&nbsp;feb,&nbsp;Year(</span><span style="color: #000000;">1987</span><span style="color: #000000;">));&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">ok</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br><br></span></div>
</span></div>
<br>在这里Year就只是包裹住了int，对int提供一层保护而已。由于operator int()的存在，只要需要，Year可以隐式的转化为int出现运算表达式中参加运算。而通过给构造函数声明为explicit，就能够保证，int到Year的转化只能在明确无误的情况进行，避免了意外的赋值。<br><br>显示构造函数和转换运算符的合作，让Year可以当int使用，同时又对Year进行一定的保护。。。<br><br><br> <img src ="http://www.cppblog.com/Marcky/aggbug/93193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-08-13 14:39 <a href="http://www.cppblog.com/Marcky/archive/2009/08/13/93193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Allocating Arrays Using Placement new (zz)</title><link>http://www.cppblog.com/Marcky/archive/2009/08/13/93110.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Wed, 12 Aug 2009 16:48:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/08/13/93110.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/93110.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/08/13/93110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/93110.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/93110.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; An additional version of operator
<tt>new</tt> enables you to construct an
object or an array of objects at a predetermined memory position. This version
is called <em>placement new</em> and has many useful applications, including
building a custom-made memory pool or a garbage collector. Additionally, it can
be used in mission-critical applications because there's no danger of
allocation failure; the memory that's used by placement
<tt>new</tt> has
already been allocated. Placement
<tt>new</tt> is also faster because the
construction of an object on a preallocated buffer takes less time.
<br><br>
<p>You already know how to use <a href="http://www.informit.com/guides/content.aspx?g=cplusplus&amp;seqNum=38">placement
<tt>new</tt></a>
to allocate a single object on a predetermined memory address. However,
some programming tasks require the allocation of arrays on a
predetermined memory address. Here's how you do it.</p>
<h4>Placement
<tt>new</tt> Overview</h4>
<p>Mobile devices, embedded systems and custom garbage collectors are
only a few instances of programming environments that may require
placement
<tt>new</tt> allocation of arrays. Before I discuss the
details of such array allocations, let's remind ourselves briefly how
scalar (i.e. non-array) placement
<tt>new</tt> works.</p>
<p>The scalar version of placement
<tt>new</tt> takes a user-supplied address on which it constructs a single object. Unlike the ordinary version of the
<tt>new</tt> operator, placement
<tt>new</tt> doesn't allocate storage for the object; it merely constructs the object on the memory address you provide:</p>
<p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">required&nbsp;for&nbsp;using&nbsp;placement&nbsp;new</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Widget&nbsp;{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;Widget();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">Widget<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Draw();<br>};<br></span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;buf</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;[</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">&nbsp;(Widget)];</span><span style="color: #008000;">//</span><span style="color: #008000;">preallocate</span><span style="color: #008000;"><br></span><span style="color: #000000;">Widget</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;widget</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">(buf)&nbsp;Widget;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">construct&nbsp;Widget&nbsp;on&nbsp;buf</span><span style="color: #008000;"><br></span><span style="color: #000000;">widget</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Draw();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">use&nbsp;Widget</span></div>
<br></p>
<p>To destroy
<tt>widget</tt> you first have to invoke its destructor explicitly:</p>
<span style="font-family: monospace;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">widget</span><span style="color: #000000;">-&gt;~</span><span style="color: #000000;">Widget();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">explicit&nbsp;destructor&nbsp;invocation</span></div>
<br></span>
<p>Next, reclaim the raw memory like this:</p>
<p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">delete[]&nbsp;buf;</span></div>
<span style="font-weight: bold;"><br></span></p>
<p><span style="font-weight: bold;">Array Allocation</span></p>
<p>Allocating arrays with placement
<tt>new</tt> follows the same steps more or less, but you have to pay attention to additional nuances. Here is a step-by-step guide:</p>
<p>First, allocate a buffer large enough to hold an array of the desired type:</p>
<span style="font-family: monospace;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;ARRSIZE&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">15</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;buf</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;[</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(Widget)</span><span style="color: #000000;">*</span><span style="color: #000000;">ARRSIZE];</span></div>
<br></span>
<p>Don't be tempted to calculate the size manually; always use
<tt>sizeof</tt> to ensure that the buffer is properly aligned and has the right size.</p>
<p>Next, construct an array of
<tt>ARRSIZE</tt> objects on the buffer using placement
<tt>new[]</tt> :</p>
<span style="font-family: monospace;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">Widget</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;widgets</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">(buf)&nbsp;Widget[ARRSIZE];</span><span style="color: #008000;">//</span><span style="color: #008000;">construct&nbsp;an&nbsp;array</span></div>
<br></span>
<p>You can now use the allocated array as usual:</p>
<pre>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ARRSIZE;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>{<br>&nbsp;widgets[i].Draw();<br>}</span></div>
Make sure that your target class --
<tt>Widget</tt> in this example -- has a public default constructor. Otherwise, it would be impossible to create arrays thereof.</pre>
<h4>Destroying the Array</h4>
<p>To destroy such an array allocated by placement
<tt>new</tt> you have to call the destructor for each element explicitly:</p>
<span style="font-family: monospace;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">ARRSIZE;<br></span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(i)<br>&nbsp;&nbsp;&nbsp;&nbsp;widgets[</span><span style="color: #000000;">--</span><span style="color: #000000;">i].</span><span style="color: #000000;">~</span><span style="color: #000000;">Widget();</span></div>
<br></span>
<p>The
<tt>while</tt> -loop uses a descending order to preserve the
canonical destruction order of C++ -- the object that was constructed
last must be destroyed first. To comply with this requirement, the
element with the highest index is destroyed first.</p>
<p>Finally, you release the raw memory on which the array resided by calling
<tt>delete[]</tt> :</p>
<pre>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">delete[]&nbsp;buf;</span></div>
<br></pre>
<h4>Performance Tuning</h4>
<p>The array placement
<tt>new</tt> has a potential performance
problem: it initializes every element in the array unconditionally. If
your app deals with large arrays, this isn't the most efficient way. In
some apps only a portion of the array is actually used, and in other
apps the elements are assigned a different value immediately after
their construction. In these cases, you want to postpone, or even
completely avoid, the automatic initialization of array elements. To
avoid the initialization of placement
<tt>new</tt> arrays, follow the following steps:</p>
<p>As before, begin with an allocation of a raw buffer with the appropriate size. This time however, use the global operator
<tt>new</tt> instead of the
<tt>new</tt> operator:</p>
<pre>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">Widget&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;warr</span><span style="color: #000000;">=</span><span style="color: #000000;"><br>static_cast</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Widget</span><span style="color: #000000;">*&gt;</span><span style="color: #000000;">&nbsp;(::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(Widget)</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;ARRSIZE));</span></div>
<br></pre>
<p>The global operator
<tt>new</tt> , very much like C's
<tt>malloc()</tt> , merely allocates raw bytes of memory from the free-store, without initializing them. It returns
<tt>void * </tt>rather than
<tt>Widget*</tt> which is why you need to cast the result explicitly.</p>
<p>At this stage,
<tt>warr</tt> is a pointer to raw memory. You can't
access its elements because they haven't been initialized yet. To
initialize individual elements, call placement
<tt>new</tt> once more, for each element you want initialized:</p>
<pre>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;assign(Widget&nbsp;arr[],&nbsp;size_t&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;sz,&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Widget</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;init)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">arr[sz</span><span style="color: #000000;">++</span><span style="color: #000000;">])&nbsp;Widget&nbsp;(init);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">invoke&nbsp;copy&nbsp;ctor</span><span style="color: #008000;"><br></span><span style="color: #000000;">}</span></div>
<br></pre>
<p>
<tt>assign()</tt> passes the address of an individual element to placement
<tt>new</tt> which in turn invokes
<tt>Widget</tt> 's copy constructor. The copy-constructor initializes that element with
<tt>init</tt> . Using this technique, you can initialize elements selectively, leaving the rest of the array uninitialized.</p>
<p>To destroy such an array, invoke the destructor of every initialized object. Then call the global operator
<tt>delete</tt> to reclaim the raw storage:</p>
<pre>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;destroy(Widget&nbsp;arr[],&nbsp;size_t&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;sz)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(sz)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arr[</span><span style="color: #000000;">--</span><span style="color: #000000;">sz].</span><span style="color: #000000;">~</span><span style="color: #000000;">Widget();</span><span style="color: #008000;">//</span><span style="color: #008000;">destroy&nbsp;all&nbsp;initialized&nbsp;elements</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">&nbsp;delete&nbsp;(arr);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">reclaim&nbsp;raw&nbsp;storage</span><span style="color: #008000;"><br></span><span style="color: #000000;">}</span></div>
<br></pre>
<h4>Summary</h4>
<p>The techniques I've presented here are bug prone. Therefore, they
should be encapsulated in higher-level classes that hide the
implementation details from users. These techniques aren't rarely-used
as they might seem. STL allocators use them under the hood to avoid
object initialization and minimize reallocations.</p>
<br><br><img src ="http://www.cppblog.com/Marcky/aggbug/93110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-08-13 00:48 <a href="http://www.cppblog.com/Marcky/archive/2009/08/13/93110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>复制构造函数之浅复制与深复制</title><link>http://www.cppblog.com/Marcky/archive/2009/07/13/89910.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Sun, 12 Jul 2009 17:56:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/07/13/89910.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/89910.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/07/13/89910.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/89910.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/89910.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 复制构造函数的函数名为类的名字，无返回值，和构造函数的区别就在于形参的不同。复制构造函数的形参为同类类型的引用，并且通常限定为const的引用，如Person类的复制构造函数的声明为：&nbsp;&nbsp;<a href='http://www.cppblog.com/Marcky/archive/2009/07/13/89910.html'>阅读全文</a><img src ="http://www.cppblog.com/Marcky/aggbug/89910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-07-13 01:56 <a href="http://www.cppblog.com/Marcky/archive/2009/07/13/89910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>构造函数初始化列表</title><link>http://www.cppblog.com/Marcky/archive/2009/07/11/89807.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Sat, 11 Jul 2009 09:47:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/07/11/89807.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/89807.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/07/11/89807.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/89807.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/89807.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 我们定义一个如下的Person类：<br>class Person {<br>public:<br>    Person() { }  //default constructor function<br>    Person(string name, string phone, string addr)&nbsp;&nbsp;<a href='http://www.cppblog.com/Marcky/archive/2009/07/11/89807.html'>阅读全文</a><img src ="http://www.cppblog.com/Marcky/aggbug/89807.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-07-11 17:47 <a href="http://www.cppblog.com/Marcky/archive/2009/07/11/89807.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>const形参的函数重载</title><link>http://www.cppblog.com/Marcky/archive/2009/07/11/89796.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Sat, 11 Jul 2009 07:09:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/07/11/89796.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/89796.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/07/11/89796.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/89796.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/89796.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 《C++ primer》中提到“仅当形参是引用或指针的时候，形参是否为const才对重载有影响。”&nbsp;&nbsp;<a href='http://www.cppblog.com/Marcky/archive/2009/07/11/89796.html'>阅读全文</a><img src ="http://www.cppblog.com/Marcky/aggbug/89796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-07-11 15:09 <a href="http://www.cppblog.com/Marcky/archive/2009/07/11/89796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于多态的有趣理解</title><link>http://www.cppblog.com/Marcky/archive/2009/07/05/89316.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Sun, 05 Jul 2009 14:12:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/07/05/89316.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/89316.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/07/05/89316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/89316.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/89316.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在CSDN学生大本营看到如下有趣的理解多态...呵呵。。。&nbsp;&nbsp;<a href='http://www.cppblog.com/Marcky/archive/2009/07/05/89316.html'>阅读全文</a><img src ="http://www.cppblog.com/Marcky/aggbug/89316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-07-05 22:12 <a href="http://www.cppblog.com/Marcky/archive/2009/07/05/89316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NULL, 0, \0 ,nul的区别(转载)</title><link>http://www.cppblog.com/Marcky/archive/2009/07/01/89032.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Wed, 01 Jul 2009 15:10:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/07/01/89032.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/89032.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/07/01/89032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/89032.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/89032.html</trackback:ping><description><![CDATA[<p><span style="color: #0000ff;">NULL</span> is a macro defined in several standard
headers, <span style="color: #0000ff;">0</span> is an integer constant, <span style="color: #0000ff;">'\0'</span> is a character constant, and
<span style="color: #0000ff;">nul </span>is the name of the character constant. All of these are <span style="font-weight: bold; text-decoration: underline; font-style: italic; font-size: 18pt; color: #ff0000;">not</span>
interchangeable:</p>
<span style="font-size: 18pt;"></span>
<p><span style="color: #ff0000; font-weight: bold;">NULL</span> is to be used for pointers only since it may be defined as <code>((void *)0)</code>, this would cause problems with anything but pointers.</p>
<p><span style="color: #ff0000; font-weight: bold;">0</span> can be used anywhere, it is the generic symbol for each type's zero value and the compiler will sort things out.</p>
<p><span style="color: #ff0000; font-weight: bold;">'\0'</span> should be used only in a character context.</p>
<p><span style="color: #ff0000; font-weight: bold;">nul</span> is not defined in C or C++, it shouldn't be used unless you define it yourself in a suitable manner, like:<span style="font-family: monospace;"><br></span></p>
<p>
</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;nul&nbsp;'\0'</span></div>
<br><span style="font-family: monospace;"></span>
<p>&#160;</p>
<p><br></p>
<br> <img src ="http://www.cppblog.com/Marcky/aggbug/89032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-07-01 23:10 <a href="http://www.cppblog.com/Marcky/archive/2009/07/01/89032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>超大整数的加法运算</title><link>http://www.cppblog.com/Marcky/archive/2009/06/30/88904.html</link><dc:creator>Marcky</dc:creator><author>Marcky</author><pubDate>Tue, 30 Jun 2009 08:02:00 GMT</pubDate><guid>http://www.cppblog.com/Marcky/archive/2009/06/30/88904.html</guid><wfw:comment>http://www.cppblog.com/Marcky/comments/88904.html</wfw:comment><comments>http://www.cppblog.com/Marcky/archive/2009/06/30/88904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Marcky/comments/commentRss/88904.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Marcky/services/trackbacks/88904.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所谓超大数就是int, 甚至long int等数据类型无法直接对其存储的整数。对于这种超大数的加法运算，我的解决方案是：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先将输入的大数转化为字符串存储起来，这样一来，字符串的首字符就对应着大数的最高位，末字符就对应大数的最低位。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后，从两个字符串的末尾开始取出一个字符，将其转化为一个一位整数后进行相加（这里相加的时候还需要加上进位标志的值），这样将产生两种情况：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一、相加后大于等于10，需要进1位。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 二、相加后小于10，不需要进位。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 待对两个字符串中的所有位字符都处理完成后，就得到了一个相加的结果字符串，这个结果字符串的不足之处是按低位到高位的顺序排列的。所以还得对其高低位的对应字符进行交换处理，从而得出正确的结果和字符串。。。<br><br>大数相加的函数C代码如下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">/*</span><span style="color: #008000;"><br>&nbsp;*功能：addBigNum函数的功能为对两个大数进行相加运算。<br>&nbsp;*参数：pa,&nbsp;pb指向需要相加的两个大数的字符串表示。<br>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; psum指向的缓冲区用来存储相加的结果和的字符串表示。<br>&nbsp;*返回值：无<br>&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;addBigNum(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pa,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pb,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">psum)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;indexa,&nbsp;indexb,&nbsp;index;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;sum,&nbsp;addone;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;addone&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">向高位进一标志</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">psum的位置索引<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">indexa,&nbsp;indexb分别索引到字符串stra,&nbsp;strb的最后一个字符</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;indexa&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;strlen(pa)&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;indexb&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;strlen(pb)&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(&nbsp;;&nbsp;indexa&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;indexb&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;indexa</span><span style="color: #000000;">--</span><span style="color: #000000;">,&nbsp;indexb</span><span style="color: #000000;">--</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">处理字符串长度不同的运算</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(indexa&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;indexb&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(pa[indexa]&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">0</span><span style="color: #000000;">'</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(pb[indexb]&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">0</span><span style="color: #000000;">'</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;addone;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(indexa&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;indexb&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(pa[indexa]&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">0</span><span style="color: #000000;">'</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;addone;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(indexa&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;indexb&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(pb[indexb]&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">0</span><span style="color: #000000;">'</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;addone;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(sum&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">两个一位数组相加最多向高位进1</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;psum[index</span><span style="color: #000000;">++</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sum&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">0</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addone&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;psum[index</span><span style="color: #000000;">++</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sum&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">0</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addone&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;psum[index]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">\0</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;swapStr(psum);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br>}<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;swapStr(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">str)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">对str指向的字符串中的字符进行逆向重排.</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;len,&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;temp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;strlen(str);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;len&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;str[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;str[len&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str[len&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;temp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span></div>
<br><br>              <img src ="http://www.cppblog.com/Marcky/aggbug/88904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Marcky/" target="_blank">Marcky</a> 2009-06-30 16:02 <a href="http://www.cppblog.com/Marcky/archive/2009/06/30/88904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>