﻿<?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++博客-Daywei0123-随笔分类-C++之父力作学习笔记</title><link>http://www.cppblog.com/Daywei0123/category/17392.html</link><description>技术追求卓越 梦想创造未来</description><language>zh-cn</language><lastBuildDate>Fri, 29 Jun 2012 12:47:22 GMT</lastBuildDate><pubDate>Fri, 29 Jun 2012 12:47:22 GMT</pubDate><ttl>60</ttl><item><title>任何时候都适用的20个C++技巧（转载）</title><link>http://www.cppblog.com/Daywei0123/archive/2012/06/29/180779.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Fri, 29 Jun 2012 09:29:00 GMT</pubDate><guid>http://www.cppblog.com/Daywei0123/archive/2012/06/29/180779.html</guid><wfw:comment>http://www.cppblog.com/Daywei0123/comments/180779.html</wfw:comment><comments>http://www.cppblog.com/Daywei0123/archive/2012/06/29/180779.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Daywei0123/comments/commentRss/180779.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Daywei0123/services/trackbacks/180779.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这些小技巧之所以特别，是因为这些信息通常吧不能在C++书籍或者网站上找到。比如说，成员指针，即使对于高级程序员也是比较棘手,和易于产生bugs的，是应该尽量避免的问题之一。&lt;翻 by凌云健笔&gt;What makes these tips special is that the information they provide usually cannot be found in ...&nbsp;&nbsp;<a href='http://www.cppblog.com/Daywei0123/archive/2012/06/29/180779.html'>阅读全文</a><img src ="http://www.cppblog.com/Daywei0123/aggbug/180779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Daywei0123/" target="_blank">Daywei</a> 2012-06-29 17:29 <a href="http://www.cppblog.com/Daywei0123/archive/2012/06/29/180779.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++之父力作学习笔记7——模板</title><link>http://www.cppblog.com/Daywei0123/archive/2011/09/24/156708.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Sat, 24 Sep 2011 09:52:00 GMT</pubDate><guid>http://www.cppblog.com/Daywei0123/archive/2011/09/24/156708.html</guid><wfw:comment>http://www.cppblog.com/Daywei0123/comments/156708.html</wfw:comment><comments>http://www.cppblog.com/Daywei0123/archive/2011/09/24/156708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Daywei0123/comments/commentRss/156708.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Daywei0123/services/trackbacks/156708.html</trackback:ping><description><![CDATA[<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;String<br /><img id="Codehighlighter1_31_172_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_172_Open_Text.style.display='none'; Codehighlighter1_31_172_Closed_Image.style.display='inline'; Codehighlighter1_31_172_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_31_172_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_31_172_Closed_Text.style.display='none'; Codehighlighter1_31_172_Open_Image.style.display='inline'; Codehighlighter1_31_172_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_31_172_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_31_172_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;Srep;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Srep</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;rep;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;C</span><span style="color: #000000">*</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;String</span><span style="color: #000000">&amp;</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;C&nbsp;read(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i)&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #000000">&nbsp;;</span></div>这是一个简单的String模板。template&lt;class C&gt;前缀说明当前正在声明的是一个模板，它有一个将在声明中使用的类型参数C。在引入后，C的使用方式恰如其他的类型名。C的作用域将一直延伸到由这个template&lt;class C&gt;作为前缀的声明的结束处。注意，template&lt;class C&gt;只是说C是一个类型名，它不必一定是某一个类得名字。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;模板类中成员的声明和定义与在非模板类里完全一样，模板类的成员也不必在类本身的内部定义，在这种情况下，它的定义必须出现在某个地方，像非模板类的成员一样。模板类的成员本身也是模板参数化的，与它们所在模板类得参数一样。在类外定义这些成员时，就显式地将它们定义为模板。例如： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;String</span><span style="color: #000000">&lt;</span><span style="color: #000000">C</span><span style="color: #000000">&gt;</span><span style="color: #000000">::Srep<br /><img id="Codehighlighter1_41_86_Open_Image" onclick="this.style.display='none'; Codehighlighter1_41_86_Open_Text.style.display='none'; Codehighlighter1_41_86_Closed_Image.style.display='inline'; Codehighlighter1_41_86_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_41_86_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_41_86_Closed_Text.style.display='none'; Codehighlighter1_41_86_Open_Image.style.display='inline'; Codehighlighter1_41_86_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_41_86_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_41_86_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;C</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;s;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sz;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;C&nbsp;String</span><span style="color: #000000">&lt;</span><span style="color: #000000">C</span><span style="color: #000000">&gt;</span><span style="color: #000000">::read(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i)</span><span style="color: #0000ff">const</span><span style="color: #000000"><br /><img id="Codehighlighter1_138_162_Open_Image" onclick="this.style.display='none'; Codehighlighter1_138_162_Open_Text.style.display='none'; Codehighlighter1_138_162_Closed_Image.style.display='inline'; Codehighlighter1_138_162_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_138_162_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_138_162_Closed_Text.style.display='none'; Codehighlighter1_138_162_Open_Image.style.display='inline'; Codehighlighter1_138_162_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_138_162_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_138_162_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;rep</span><span style="color: #000000">-&gt;</span><span style="color: #000000">s[i];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;String</span><span style="color: #000000">&lt;</span><span style="color: #000000">C</span><span style="color: #000000">&gt;</span><span style="color: #000000">::String()<br /><img id="Codehighlighter1_203_232_Open_Image" onclick="this.style.display='none'; Codehighlighter1_203_232_Open_Text.style.display='none'; Codehighlighter1_203_232_Closed_Image.style.display='inline'; Codehighlighter1_203_232_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_203_232_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_203_232_Closed_Text.style.display='none'; Codehighlighter1_203_232_Open_Image.style.display='inline'; Codehighlighter1_203_232_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_203_232_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_203_232_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;rep&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Srep(</span><span style="color: #000000">0</span><span style="color: #000000">,C());<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在一个程序里，对一个类成员函数只能有一个函数定义。同样，对于一个类模板成员函数，在一个程序里也只能有一个函数模板定义。但在另一方面，重载只能针对函数去做，而专门化使我们能够为同一个模板提供不同的实现。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类模板的名字不能重载。所以，如果在某个作用域里声明了一个类模板，就不能有其他以同样名字声明的实体。<br /> <img src ="http://www.cppblog.com/Daywei0123/aggbug/156708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Daywei0123/" target="_blank">Daywei</a> 2011-09-24 17:52 <a href="http://www.cppblog.com/Daywei0123/archive/2011/09/24/156708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C+之父力作学习笔记6——派生类</title><link>http://www.cppblog.com/Daywei0123/archive/2011/08/28/154555.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Sun, 28 Aug 2011 09:20:00 GMT</pubDate><guid>http://www.cppblog.com/Daywei0123/archive/2011/08/28/154555.html</guid><wfw:comment>http://www.cppblog.com/Daywei0123/comments/154555.html</wfw:comment><comments>http://www.cppblog.com/Daywei0123/archive/2011/08/28/154555.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/Daywei0123/comments/commentRss/154555.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Daywei0123/services/trackbacks/154555.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现在来考虑做一个程序，处理某公司所雇佣人员的问题。这个程序可能包含如下一种数据结构： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;Employee<br /><img id="Codehighlighter1_16_132_Open_Image" onclick="this.style.display='none'; Codehighlighter1_16_132_Open_Text.style.display='none'; Codehighlighter1_16_132_Closed_Image.style.display='inline'; Codehighlighter1_16_132_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_16_132_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_16_132_Closed_Text.style.display='none'; Codehighlighter1_16_132_Open_Image.style.display='inline'; Codehighlighter1_16_132_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_16_132_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_16_132_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;first_name,family_name;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;middle_initial;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;hiring_date;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">short</span><span style="color: #000000">&nbsp;department;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #000000">;</span></div>下一步我们可能需要去定义经理： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;Manager<br /><img id="Codehighlighter1_15_98_Open_Image" onclick="this.style.display='none'; Codehighlighter1_15_98_Open_Text.style.display='none'; Codehighlighter1_15_98_Closed_Image.style.display='inline'; Codehighlighter1_15_98_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_15_98_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_15_98_Closed_Text.style.display='none'; Codehighlighter1_15_98_Open_Image.style.display='inline'; Codehighlighter1_15_98_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_15_98_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_15_98_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Employee&nbsp;emp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;list</span><span style="color: #000000">&lt;</span><span style="color: #000000">Employee</span><span style="color: #000000">*&gt;</span><span style="color: #000000">&nbsp;group;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">所管理的人员</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">short</span><span style="color: #000000">&nbsp;level;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #000000">;</span></div>一个经理同时也是一个雇员，所以在Manager对象的emp成员存储着Employee数据。很明显这样的设计是糟糕的，大家都会想到派生：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;Manager:</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Employee<br /><img id="Codehighlighter1_31_77_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_77_Open_Text.style.display='none'; Codehighlighter1_31_77_Closed_Image.style.display='inline'; Codehighlighter1_31_77_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_31_77_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_31_77_Closed_Text.style.display='none'; Codehighlighter1_31_77_Open_Image.style.display='inline'; Codehighlighter1_31_77_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_31_77_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_31_77_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;list</span><span style="color: #000000">&lt;</span><span style="color: #000000">Employee</span><span style="color: #000000">*&gt;</span><span style="color: #000000">&nbsp;group;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">short</span><span style="color: #000000">&nbsp;level;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">;</span></div>这个Manager是由Employee派生的，反过来就是说，Employee是Manager的一个基类。类Manager包含类Employee得所有成员，再加上它自己的一些成员。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;按照这种方式从Employee派生出Manager，就使Manager成为Employee的一个子类型，使Manager可以用在能够接受Employee的任何地方。因为Manager是Employee，所以Manager*就可以当做Employee*使用。然而，因为Employee不一定是Manager，所以Employee*就不能当做Manager*用。总而言之类Derived有一个公用基类Base，那么就可以用Derived*给Base*类型的变量赋值，不需要显示的类型转换。而相反的方向，从Base*到Derived*则必须显示转换。例如： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;g(Manager&nbsp;mm,Employee&nbsp;ee)<br /><img id="Codehighlighter1_31_266_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_266_Open_Text.style.display='none'; Codehighlighter1_31_266_Closed_Image.style.display='inline'; Codehighlighter1_31_266_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_31_266_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_31_266_Closed_Text.style.display='none'; Codehighlighter1_31_266_Open_Image.style.display='inline'; Codehighlighter1_31_266_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_31_266_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_31_266_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Employee</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pe&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">mm;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">可以：Manager都是Employee</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Manager</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">ee;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">错误：Employee不一定是Manager</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;pm</span><span style="color: #000000">-&gt;</span><span style="color: #000000">level&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">灾难：ee没有level</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;pm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;static_cast</span><span style="color: #000000">&lt;</span><span style="color: #000000">Manager</span><span style="color: #000000">*&gt;</span><span style="color: #000000">(pe);</span><span style="color: #008000">//</span><span style="color: #008000">蛮力：这个可以，因为pe指向的是Manager&nbsp;mm</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;pm</span><span style="color: #000000">-&gt;</span><span style="color: #000000">level&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</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 /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" /></span><span style="color: #000000">}</span></span></div><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;派生类的成员可以使用其基类的公用的和保护的成员，但是，派生类不能使用基类的私有成员。对于派生类的成年公园而言，保护成员就像是公用成员；但对于其他函数它们则像是私用成员。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面说说派生类的构造函数和析构函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有些派生类需要构造函数。如果某个基类中有构造函数，那么就必须调用这些构造函数中的某一个。默认构造函数可以被隐含的调用，但是，如果一个基类的所有构造函数都有参数，那么就必须显示的调用其中的某一个。基类构造函数的参数应在派生类构造函数的定义中有明确描述。在这方面，基类的行为恰恰就像是派生类的一个成员。例如： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">Employee::Employee(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;n,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;d):family(n),department(d)<br /><img id="Codehighlighter1_66_78_Open_Image" onclick="this.style.display='none'; Codehighlighter1_66_78_Open_Text.style.display='none'; Codehighlighter1_66_78_Closed_Image.style.display='inline'; Codehighlighter1_66_78_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_66_78_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_66_78_Closed_Text.style.display='none'; Codehighlighter1_66_78_Open_Image.style.display='inline'; Codehighlighter1_66_78_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_66_78_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_66_78_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_143_151_Open_Image" onclick="this.style.display='none'; Codehighlighter1_143_151_Open_Text.style.display='none'; Codehighlighter1_143_151_Closed_Image.style.display='inline'; Codehighlighter1_143_151_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_143_151_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_143_151_Closed_Text.style.display='none'; Codehighlighter1_143_151_Open_Image.style.display='inline'; Codehighlighter1_143_151_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">Manager::Manager(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;n,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;d,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;lvl):Employee(n,d),</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_143_151_Closed_Text">/**/</span><span id="Codehighlighter1_143_151_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">初始化基类</span><span style="color: #008000">*/</span></span><span style="color: #000000">level(lvl)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_162_170_Closed_Text">/**/</span><span id="Codehighlighter1_162_170_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">初始化成员</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_172_184_Open_Image" onclick="this.style.display='none'; Codehighlighter1_172_184_Open_Text.style.display='none'; Codehighlighter1_172_184_Closed_Image.style.display='inline'; Codehighlighter1_172_184_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_172_184_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_172_184_Closed_Text.style.display='none'; Codehighlighter1_172_184_Open_Image.style.display='inline'; Codehighlighter1_172_184_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_172_184_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_172_184_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" /></span><span style="color: #000000">}</span></span></div>派生类的构造函数只能描述它自己的成员和自己的直接基类的初始式，它不能直接去初始化基类的成员，例如：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">Manager::Manager(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;n,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;d,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;lvl):family_name(n).department(d),level(lvl)</span><span style="color: #008000">//</span><span style="color: #008000">错误：在Manager里没有family_name和department的声明</span><span style="color: #008000"><br /><img id="Codehighlighter1_129_137_Open_Image" onclick="this.style.display='none'; Codehighlighter1_129_137_Open_Text.style.display='none'; Codehighlighter1_129_137_Closed_Image.style.display='inline'; Codehighlighter1_129_137_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_129_137_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_129_137_Closed_Text.style.display='none'; Codehighlighter1_129_137_Open_Image.style.display='inline'; Codehighlighter1_129_137_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_129_137_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_129_137_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" /></span><span style="color: #000000">}</span></span></div>&nbsp;类对象的构造是自下而上进行的：首先是基类，而后是成员，再后才是派生类本身。类对象的销毁则正好以相反的顺序进行：首先是派生类本身，而后是成员，再后才是基类。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于给定的一个类型为Base*的指针，被指的对象到底属于哪个派生类型呢？这个问题有四种基本的解决方案： 
<ol><li>&nbsp;保证被指的只能是唯一类型的对象<br /></li><li>在基类里安排一个类型域，供函数检查<br /></li><li>&nbsp;使用dynamic_cast<br /></li><li>&nbsp;使用虚函数&nbsp;&nbsp;</li></ol>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从Employee的函数中取得&#8220;正确的&#8221;行为i，而又不依赖于实际使用的到底是哪一种Employee，这就是所谓的多态性。一个带有虚函数的类型被称为是一个多态类型。要在C++里取得多态行为，被调用的函数就必须是虚函数，而对象则必须是通过指针或者引用去操作的。如果直接操作一个对象（而不是通过指针或引用），它的确切类型就已经为编译器所知，因此也就不需要运行时的多态性了。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;那么一个虚函数声明为纯虚函数，则这个虚函数所在的类为抽象类。用=0作为初始式就使虚函数成为&#8220;纯虚的&#8221;。注意：不能创建抽象类的对象。抽象类只能做界面，作为其他类的基类。还有一点也要指的注意，一个未在派生类里定义的纯虚函数仍旧还是一个纯虚函数，这种情况也将使该派生类仍为一个抽象类。例如：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Shape<br /><img id="Codehighlighter1_12_103_Open_Image" onclick="this.style.display='none'; Codehighlighter1_12_103_Open_Text.style.display='none'; Codehighlighter1_12_103_Closed_Image.style.display='inline'; Codehighlighter1_12_103_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_12_103_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_12_103_Closed_Text.style.display='none'; Codehighlighter1_12_103_Open_Image.style.display='inline'; Codehighlighter1_12_103_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_12_103_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_12_103_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&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()</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;isClose()</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Circel:</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Shape<br /><img id="Codehighlighter1_133_218_Open_Image" onclick="this.style.display='none'; Codehighlighter1_133_218_Open_Text.style.display='none'; Codehighlighter1_133_218_Closed_Image.style.display='inline'; Codehighlighter1_133_218_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_133_218_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_133_218_Closed_Text.style.display='none'; Codehighlighter1_133_218_Open_Image.style.display='inline'; Codehighlighter1_133_218_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_133_218_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_133_218_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img id="Codehighlighter1_168_181_Open_Image" onclick="this.style.display='none'; Codehighlighter1_168_181_Open_Text.style.display='none'; Codehighlighter1_168_181_Closed_Image.style.display='inline'; Codehighlighter1_168_181_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_168_181_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_168_181_Closed_Text.style.display='none'; Codehighlighter1_168_181_Open_Image.style.display='inline'; Codehighlighter1_168_181_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;isClose()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_168_181_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_168_181_Open_Text"><span style="color: #000000">{</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;}</span></span><span style="color: #008000">//</span><span style="color: #008000">覆盖Shap::isClose<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">draw尚未覆盖</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #000000">;<br /><br />Circel a;//错误：声明的是抽象类Circel对象</span></div>
<p>抽象类的最重要用途就使提供一个界面，而又不是暴露任何实现的细节。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;忠告&nbsp;：</p>
<ul><li>避免类型域</li><li>用抽象类将设计的中心集中到提供清晰的界面方面</li><li>用抽象类使界面最小化</li><li>一个有虚函数的类应该有一个虚析构函数</li><li>抽象类通常不需要构造函数</li></ul><img src ="http://www.cppblog.com/Daywei0123/aggbug/154555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Daywei0123/" target="_blank">Daywei</a> 2011-08-28 17:20 <a href="http://www.cppblog.com/Daywei0123/archive/2011/08/28/154555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++之父力作学习笔记5——运算符重载</title><link>http://www.cppblog.com/Daywei0123/archive/2011/08/20/153958.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Sat, 20 Aug 2011 05:41:00 GMT</pubDate><guid>http://www.cppblog.com/Daywei0123/archive/2011/08/20/153958.html</guid><wfw:comment>http://www.cppblog.com/Daywei0123/comments/153958.html</wfw:comment><comments>http://www.cppblog.com/Daywei0123/archive/2011/08/20/153958.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Daywei0123/comments/commentRss/153958.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Daywei0123/services/trackbacks/153958.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在C++包含很多运算符，但以下几个运算符不能由用户定义：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;：：（作用域解析；）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;，（成员选择）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.* （通过到成员的指针做成员选择）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;？：三元条件运算符<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sizeof和typeid<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;运算符函数的名字是由关键字operator后跟对应的运算符构成的；例如operator&lt;&lt;。运算符函数的定义和使用都可以像其他函数一样。使用运算符不过是显示调用运算符函数的一种简写形式。例如 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f(complex&nbsp;a,complex&nbsp;b)<br /><img id="Codehighlighter1_28_91_Open_Image" onclick="this.style.display='none'; Codehighlighter1_28_91_Open_Text.style.display='none'; Codehighlighter1_28_91_Closed_Image.style.display='inline'; Codehighlighter1_28_91_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_28_91_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_28_91_Closed_Text.style.display='none'; Codehighlighter1_28_91_Open_Image.style.display='inline'; Codehighlighter1_28_91_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_28_91_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_28_91_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;complex&nbsp;c</span><span style="color: #000000">=</span><span style="color: #000000">a</span><span style="color: #000000">+</span><span style="color: #000000">b;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">简写</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;complex&nbsp;d</span><span style="color: #000000">=</span><span style="color: #000000">a.</span><span style="color: #0000ff">operator</span><span style="color: #000000">+</span><span style="color: #000000">(b);</span><span style="color: #008000">//</span><span style="color: #008000">显示调用</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" /></span><span style="color: #000000">}</span></span></div>
<p style="margin-right: 0px"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个运算符函数必须或者是一个成员函数，或者至少有一个用户定义类型的参数（重新定义运算符new和delete的函数则没有此项要求）。这一规则就保证了用户不能改变原有表达式的意义，除非表达式中包含有用户定义类型的对象。特别的，不能定义只对指针进行操作的运算符函数。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;忠告：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.定义运算符主要是为了模仿习惯使用方式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.对于大型运算对象，请使用const引用参数类型<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.对于需要访问表示的操作，优先考虑作为成员函数而不是作为非成员函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.对于对称的运算符采用非成员函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.将只有一个&#8220;大小参数&#8221;的构造函数做成explicit<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;运算符重载的内容应该还是挺多的，但却不知道如何写，看来还是文笔太差了，有机会再补上吧。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><img src ="http://www.cppblog.com/Daywei0123/aggbug/153958.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Daywei0123/" target="_blank">Daywei</a> 2011-08-20 13:41 <a href="http://www.cppblog.com/Daywei0123/archive/2011/08/20/153958.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++之父力作学习笔记（4）——类的好多事</title><link>http://www.cppblog.com/Daywei0123/archive/2011/08/05/152568.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Fri, 05 Aug 2011 09:00:00 GMT</pubDate><guid>http://www.cppblog.com/Daywei0123/archive/2011/08/05/152568.html</guid><wfw:comment>http://www.cppblog.com/Daywei0123/comments/152568.html</wfw:comment><comments>http://www.cppblog.com/Daywei0123/archive/2011/08/05/152568.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/Daywei0123/comments/commentRss/152568.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Daywei0123/services/trackbacks/152568.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类，这个概念比较大。包含的事太多。咱们就一一的尽量弄清楚它。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个类就是一个用户定义类型。C++里类概念的目标就是为程序员提供一种建立新类型的工具，是这些新类型的使用能够像内部一样方便。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;访问控制：class成员的默认访问方式是私有的。一个struct也是一个class，但是其成员的默认方式是公用的。非成员函数禁止访问私有成员。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;构造函数：就是函数名和类名一样的函数且没有返回值。这谁都知道。It's easy。而默认构造函数就是调用时不必提供参数的构造函数。如果用户自己声明了一个默认构造函数，那么就会去使用它；否则，如果有必要，而且用户没有声明其他的构造函数，编译器就会设法去生成一个。编译器生成的默认构造函数将隐式地为<strong><u>类类型</u></strong>的成员和它的基类调用有关的默认构造函数。这里解释一下：类类型（Class type）即指那些由程序员定义的类而产生的类型，以便与内部类型和其他用户定义类型相区分。相信大家这里也没什么问题。有一个注意点来了，<strong>由于const和引用必须进行初始化，包含const或引用成员的类就不能进行默认构造，除非程序员的我们自己显示的提供默认构造函数</strong>。例如： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;X<br /><img id="Codehighlighter1_9_46_Open_Image" onclick="this.style.display='none'; Codehighlighter1_9_46_Open_Text.style.display='none'; Codehighlighter1_9_46_Closed_Image.style.display='inline'; Codehighlighter1_9_46_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_9_46_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_9_46_Closed_Text.style.display='none'; Codehighlighter1_9_46_Open_Image.style.display='inline'; Codehighlighter1_9_46_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_9_46_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_9_46_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&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;a;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;r;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000">;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />X&nbsp;x;</span><span style="color: #008000">//</span><span style="color: #008000">错误;X无默认构造函数</span></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;默认构造函数也可以显示调用。内部类型同样也有默认构造函数。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面再谈谈复制构造函数，先看看复制构造函数是怎么引进来的。<br />按照默认约定，类对象可以复制。特别是可以用一个类的对象和复制对该类的其他对象进行初始化。即使是声明了构造函数的地方，也是可以这样做： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">Date&nbsp;d</span><span style="color: #000000">=</span><span style="color: #000000">today;</span><span style="color: #008000">//</span><span style="color: #008000">通过复制初始化</span></div>按照默认方式，类对象的复制就是其中各个成员的复制。如果某个类X所需要的不是这种默认方式，那么就可以定义一个复制构造函数X::X(const X&amp;)，由它提供所需要的行为。还有一个概念就是复制赋值，很容易和复制构造函数搞混。咱们就一起搞清楚它们。先看一段程序： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;h()<br /><img id="Codehighlighter1_9_86_Open_Image" onclick="this.style.display='none'; Codehighlighter1_9_86_Open_Text.style.display='none'; Codehighlighter1_9_86_Closed_Image.style.display='inline'; Codehighlighter1_9_86_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_9_86_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_9_86_Closed_Text.style.display='none'; Codehighlighter1_9_86_Open_Image.style.display='inline'; Codehighlighter1_9_86_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_9_86_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_9_86_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;Table&nbsp;t1;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;Table&nbsp;t2</span><span style="color: #000000">=</span><span style="color: #000000">t1;</span><span style="color: #008000">//</span><span style="color: #008000">复制初始化</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Table&nbsp;t3;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;t3</span><span style="color: #000000">=</span><span style="color: #000000">t2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">复制赋值</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" /></span><span style="color: #000000">}</span></span></div>看似好像没什么问题，对于复制上面提到的解释方式，在应用到具有指针成员的类的对象时，就可能产生一种出人意料的作用。对于包含了由构造函数/析构函数管理的资源的对象而言，按成员复制的语义通常是不正确的。在这里，Table的默认构造函数为t1和t3各调用了一次，一共是两次。然而Table的析构函数则被调用了三次;对t1、t2和t3各一次！由于赋值的默认解释是按成员赋值，所以在h()结束时，t1、t2和t3中将各包含一个指针，它们都指向建立t1时从自由存储中分配的那个名字数组。在建立t3时所分配的数组的指针并没有保留下来，因为它被赋值t3=t2覆盖掉了。这样，如果没有自动废料收集，对这个程序而言，该数组的存储就将永远丢掉了。而在另一方面，为t1的创建而分配的数组因为同时出现在t1、t2和t3里，将被删除3次。这种情况所导致的结果是无定义，很可能是灾难性的。这类反常情况可以避免，方式就是将Table复制的意义定义清楚： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Table<br /><img id="Codehighlighter1_12_99_Open_Image" onclick="this.style.display='none'; Codehighlighter1_12_99_Open_Text.style.display='none'; Codehighlighter1_12_99_Closed_Image.style.display='inline'; Codehighlighter1_12_99_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_12_99_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_12_99_Closed_Text.style.display='none'; Codehighlighter1_12_99_Open_Image.style.display='inline'; Codehighlighter1_12_99_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_12_99_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_12_99_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">---</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Table(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;Table</span><span style="color: #000000">&amp;</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">复制构造函数</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Table</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">const</span><span style="color: #000000">&nbsp;Table</span><span style="color: #000000">&amp;</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">复制赋值</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" /></span><span style="color: #000000">}</span></span><span style="color: #000000">;</span></div>咱们自己可以为这些复制操作定义自己认为最合适的任何意义，例如<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #008000">//这里补上</span><span style="color: #008000">Table类的详细定义</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Table<br /><img id="Codehighlighter1_24_224_Open_Image" onclick="this.style.display='none'; Codehighlighter1_24_224_Open_Text.style.display='none'; Codehighlighter1_24_224_Closed_Image.style.display='inline'; Codehighlighter1_24_224_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_24_224_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_24_224_Closed_Text.style.display='none'; Codehighlighter1_24_224_Open_Image.style.display='inline'; Codehighlighter1_24_224_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_24_224_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_24_224_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;Name</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;p;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;sz;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;Table(size_t&nbsp;s</span><span style="color: #000000">=</span><span style="color: #000000">15</span><span style="color: #000000">)<br /><img id="Codehighlighter1_89_121_Open_Image" onclick="this.style.display='none'; Codehighlighter1_89_121_Open_Text.style.display='none'; Codehighlighter1_89_121_Closed_Image.style.display='inline'; Codehighlighter1_89_121_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_89_121_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_89_121_Closed_Text.style.display='none'; Codehighlighter1_89_121_Open_Image.style.display='inline'; Codehighlighter1_89_121_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_89_121_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_89_121_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Name[sz</span><span style="color: #000000">=</span><span style="color: #000000">s];<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">Table()<br /><img id="Codehighlighter1_140_167_Open_Image" onclick="this.style.display='none'; Codehighlighter1_140_167_Open_Text.style.display='none'; Codehighlighter1_140_167_Closed_Image.style.display='inline'; Codehighlighter1_140_167_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_140_167_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_140_167_Closed_Text.style.display='none'; Codehighlighter1_140_167_Open_Image.style.display='inline'; Codehighlighter1_140_167_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_140_167_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_140_167_Open_Text"><span style="color: #000000">{&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete[]&nbsp;p;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;Name</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;loopup(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;insert(Name</span><span style="color: #000000">*</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />Table::Table(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;Table</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;t)</span><span style="color: #008000">//</span><span style="color: #008000">复制构造函数</span><span style="color: #008000"><br /><img id="Codehighlighter1_264_333_Open_Image" onclick="this.style.display='none'; Codehighlighter1_264_333_Open_Text.style.display='none'; Codehighlighter1_264_333_Closed_Image.style.display='inline'; Codehighlighter1_264_333_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_264_333_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_264_333_Closed_Text.style.display='none'; Codehighlighter1_264_333_Open_Image.style.display='inline'; Codehighlighter1_264_333_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_264_333_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_264_333_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Name[z</span><span style="color: #000000">=</span><span style="color: #000000">t.sz];<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</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">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">sz;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p[i]</span><span style="color: #000000">=</span><span style="color: #000000">t.p[i];<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />Table</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;Table::</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;Table</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;t)</span><span style="color: #008000">//</span><span style="color: #008000">赋值</span><span style="color: #008000"><br /><img id="Codehighlighter1_380_533_Open_Image" onclick="this.style.display='none'; Codehighlighter1_380_533_Open_Text.style.display='none'; Codehighlighter1_380_533_Closed_Image.style.display='inline'; Codehighlighter1_380_533_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_380_533_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_380_533_Closed_Text.style.display='none'; Codehighlighter1_380_533_Open_Image.style.display='inline'; Codehighlighter1_380_533_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_380_533_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_380_533_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #0000ff">this</span><span style="color: #000000">!=&amp;</span><span style="color: #000000">t)//当心自赋值：t=t<br /><img id="Codehighlighter1_403_513_Open_Image" onclick="this.style.display='none'; Codehighlighter1_403_513_Open_Text.style.display='none'; Codehighlighter1_403_513_Closed_Image.style.display='inline'; Codehighlighter1_403_513_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_403_513_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_403_513_Closed_Text.style.display='none'; Codehighlighter1_403_513_Open_Image.style.display='inline'; Codehighlighter1_403_513_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_403_513_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_403_513_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete[]&nbsp;p;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Name[sz</span><span style="color: #000000">=</span><span style="color: #000000">t.sz];<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</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">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">sz;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p[i]</span><span style="color: #000000">=</span><span style="color: #000000">t.p[i];<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&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 /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div>情况几乎总是如此，复制构造函数与复制赋值通常都很不一样。究其根本原因，复制构造函数是去完成对为初始化的存储区的初始化，而复制赋值运算符则必须正确处理一个结构良好的对象。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;成员常量：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对那些静态整型成员，可以给它的成员声明加上一个常量表达式作为初始式，例如<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Curious<br /><img id="Codehighlighter1_14_213_Open_Image" onclick="this.style.display='none'; Codehighlighter1_14_213_Open_Text.style.display='none'; Codehighlighter1_14_213_Closed_Image.style.display='inline'; Codehighlighter1_14_213_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_14_213_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_14_213_Closed_Text.style.display='none'; Codehighlighter1_14_213_Open_Image.style.display='inline'; Codehighlighter1_14_213_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_14_213_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_14_213_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&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;c1</span><span style="color: #000000">=</span><span style="color: #000000">7</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">ok，但要记得去定义</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;c2</span><span style="color: #000000">=</span><span style="color: #000000">11</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">错误：非const</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&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;c3;</span><span style="color: #008000">//</span><span style="color: #008000">错误：非Static</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&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;c4</span><span style="color: #000000">=</span><span style="color: #000000">f(</span><span style="color: #000000">1</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">错误：在类里的初始表达式不是常量</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">float</span><span style="color: #000000">&nbsp;c5</span><span style="color: #000000">=</span><span style="color: #000000">7.0</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">错误：在类里初始化的不是整型</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" /></span><span style="color: #000000">}</span></span></div><span style="text-align: left; line-height: 23px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-variant: normal; font-style: normal; text-indent: 0px; font-family: simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 14px; word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 21px; color: rgb(255,0,0)">1</span>）在类中不能用const来创建常量！因为：类只是描述了对象的形式，并没有真正创建对象！所以， 在对象建立之前，并没有存值空间！<br /><span style="line-height: 21px; color: rgb(255,0,0)">2</span>）而const是用来创建常量的！ 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">方法1&nbsp;你可以用枚举：<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;a<br /><img id="Codehighlighter1_20_72_Open_Image" onclick="this.style.display='none'; Codehighlighter1_20_72_Open_Text.style.display='none'; Codehighlighter1_20_72_Closed_Image.style.display='inline'; Codehighlighter1_20_72_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_20_72_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_20_72_Closed_Text.style.display='none'; Codehighlighter1_20_72_Open_Image.style.display='inline'; Codehighlighter1_20_72_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_20_72_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_20_72_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_26_50_Open_Image" onclick="this.style.display='none'; Codehighlighter1_26_50_Open_Text.style.display='none'; Codehighlighter1_26_50_Closed_Image.style.display='inline'; Codehighlighter1_26_50_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_26_50_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_26_50_Closed_Text.style.display='none'; Codehighlighter1_26_50_Open_Image.style.display='inline'; Codehighlighter1_26_50_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #0000ff">enum</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_26_50_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_26_50_Open_Text"><span style="color: #000000">{buf_size_t&nbsp;buf_size</span><span style="color: #000000">=</span><span style="color: #000000">、、、}</span></span><span style="color: #008000">//</span><span style="color: #008000">用枚举创建一个常量，但不是数据成员</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />方法2&nbsp;你可以用static<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;a<br /><img id="Codehighlighter1_97_175_Open_Image" onclick="this.style.display='none'; Codehighlighter1_97_175_Open_Text.style.display='none'; Codehighlighter1_97_175_Closed_Image.style.display='inline'; Codehighlighter1_97_175_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_97_175_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_97_175_Closed_Text.style.display='none'; Codehighlighter1_97_175_Open_Image.style.display='inline'; Codehighlighter1_97_175_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_97_175_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_97_175_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">private</span><span style="color: #000000">：<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;buf_size_t&nbsp;buf_size</span><span style="color: #000000">=</span><span style="color: #000000">30</span><span style="color: #000000">；</span><span style="color: #008000">//</span><span style="color: #008000">该常量将与憋得静态常量存储在一起，而不是存储在对象中</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" /></span><span style="color: #000000">}</span></span></div>但《C++程序设计语言》书上说当你用到某个被初始化的成员，而且需要将它作为对象存入存储器时，这个成员就必须在某处有定义。初始式不必重复写： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Curious::c1;</span><span style="color: #008000">//</span><span style="color: #008000">必须，但这里不必重复初始式</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=&amp;</span><span style="color: #000000">Cusious::c1;</span><span style="color: #008000">//</span><span style="color: #008000">ok:Curious::c1已经有定义</span></div>这里有点让我懵了，为什么还要<span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Curious::c1;</span><span style="color: #008000">//</span><span style="color: #008000">必须，但这里不必重复初始式&nbsp;</span>这一行呢？还说是必须，经过测试是有问题的&#8212;&#8212;当前范围内的定义或重新声明非法，到底是书错了还是还有其他什么原因？<br />还请高手不吝赐教<br />今天就到这里吧，到这里就出了问题，还需要思考。<br /><br />这里有一篇博文关于<br /><span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 20px/30px 'Microsoft YaHei'; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><a style="color: rgb(0,0,0); text-decoration: none" title="VC6.0中，整型const static成员不能在类的定义体中初始化." href="http://blog.csdn.net/yiruirui0507/article/details/5984530">VC6.0中，整型const static成员不能在类的定义体中初始化.</a></span>&nbsp;<a href="http://blog.csdn.net/yiruirui0507/article/details/5984530">http://blog.csdn.net/yiruirui0507/article/details/5984530</a><br /><br /><br /></span><br /><br /><img src ="http://www.cppblog.com/Daywei0123/aggbug/152568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Daywei0123/" target="_blank">Daywei</a> 2011-08-05 17:00 <a href="http://www.cppblog.com/Daywei0123/archive/2011/08/05/152568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++之父力作学习笔记3——指针</title><link>http://www.cppblog.com/Daywei0123/archive/2011/07/26/151856.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Tue, 26 Jul 2011 03:13:00 GMT</pubDate><guid>http://www.cppblog.com/Daywei0123/archive/2011/07/26/151856.html</guid><wfw:comment>http://www.cppblog.com/Daywei0123/comments/151856.html</wfw:comment><comments>http://www.cppblog.com/Daywei0123/archive/2011/07/26/151856.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/Daywei0123/comments/commentRss/151856.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Daywei0123/services/trackbacks/151856.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;由于工作需要转成了C#，好久没有学C++了，之前学了一段时间的C++，也写过两篇，放在博客园里的，现在有专门的C++博客，以后就在这里写了。以下是前两篇的地址<br /><a href="http://www.cnblogs.com/Daywei/archive/2011/01/11/Notes2.html">C++之父力作学习笔记1&nbsp;&nbsp;&nbsp;&nbsp;<u><font color="#800080">C++之父力作学习笔记</font></u><br /></a>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;今天来简单说一下指针，可以说指针是一个难点，是一把双刃剑，也许高手才能运用自如，像我这样的菜鸟就会伤到自己。呵呵，废话少说。<br />&nbsp;&nbsp;&nbsp;指针：对类型T，T*是&#8220;到T的指针&#8221;，也就是说，一个类型为T*的变量能保存一个类型T的对象的地址。例如：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;c</span><span style="color: #000000">=</span><span style="color: #000000">'</span><span style="color: #000000">a</span><span style="color: #000000">'</span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">p</span><span style="color: #000000">=&amp;</span><span style="color: #000000">c;</span><span style="color: #008000">//</span><span style="color: #008000">p保存着c的地址</span></div><br />用图表示是：<img height="85" alt="" src="http://www.cppblog.com/images/cppblog_com/daywei0123/指针图.png" width="306" border="0" longdesc="" /><br /><br />这些都挺容易理解的，不幸的是，到数组的指针和到函数的指针需要更复杂的记法：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">int</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pi;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">到int的指针</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">char</span><span style="color: #000000">**</span><span style="color: #000000">&nbsp;ppc;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">到字符的指针的指针</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;ap[</span><span style="color: #000000">10</span><span style="color: #000000">];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">10个到int的指针的数组</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">*</span><span style="color: #000000">fp)(</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">到函数的指针，这种函数以char*为参数，返回int</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;f(</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">有一个char*参数的函数，返回一个到ini的指针</span></div><br />&nbsp;&nbsp;&nbsp;对指针的基本操作是间接引用，也就是说引用被指针所指的那个对象。这一操作也被称作间接（indirectionn）。间接运算符是（前缀的）一元*。例如
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;c</span><span style="color: #000000">=</span><span style="color: #000000">'</span><span style="color: #000000">a</span><span style="color: #000000">'</span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=&amp;</span><span style="color: #000000">c;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">p保存着c的地址</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;c2</span><span style="color: #000000">=*</span><span style="color: #000000">p;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">c2=='a'</span></div>被p所指的变量是c，而c中所存的值是'a'。所以由*p赋给c2的值就是'a'.<br />注意：这里解释一下 间接运算符是（前缀的）一元*。这就要扯到声明的结构了。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个声明由四个部分组成：一个可选的&#8220;描述符&#8221;，一个基础类型，一个声明符，还有一个可选的初始式。除了函数和名字空间之外，其他声明都应该由分号结束。例如：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_14_47_Open_Image" onclick="this.style.display='none'; Codehighlighter1_14_47_Open_Text.style.display='none'; Codehighlighter1_14_47_Closed_Image.style.display='inline'; Codehighlighter1_14_47_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_14_47_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_14_47_Closed_Text.style.display='none'; Codehighlighter1_14_47_Open_Image.style.display='inline'; Codehighlighter1_14_47_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;kings[]</span><span style="color: #000000">=</span><span id="Codehighlighter1_14_47_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_14_47_Open_Text"><span style="color: #000000">{</span><span style="color: #000000">"</span><span style="color: #000000">Antigonus</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">Seleucus</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">Ptolemy</span><span style="color: #000000">"</span><span style="color: #000000">}</span></span><span style="color: #000000">;</span></div>这里的基础类型是char，声明符是*kings[],而初始化是={...}。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;描述符是一个开始关键字，例如：virtual和extern，它们说明了被声明事物的某些非类型的属性。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;声明符由一个名字和可选的若干声明运算符组成。最常用的声明运算符是<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指针&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前缀<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*const&nbsp;&nbsp;&nbsp;&nbsp; 常量指针&nbsp;&nbsp;&nbsp;&nbsp; 前缀<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;前缀<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数组&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 后缀<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 函数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;后缀<br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/Daywei0123/aggbug/151856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Daywei0123/" target="_blank">Daywei</a> 2011-07-26 11:13 <a href="http://www.cppblog.com/Daywei0123/archive/2011/07/26/151856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>