﻿<?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++博客-yg2362-随笔分类-C++</title><link>http://www.cppblog.com/yg2362/category/19797.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 23 Sep 2012 21:25:47 GMT</lastBuildDate><pubDate>Sun, 23 Sep 2012 21:25:47 GMT</pubDate><ttl>60</ttl><item><title>Unicode和UTF-8的区别</title><link>http://www.cppblog.com/yg2362/archive/2012/09/23/191746.html</link><dc:creator>梨树阳光</dc:creator><author>梨树阳光</author><pubDate>Sun, 23 Sep 2012 14:56:00 GMT</pubDate><guid>http://www.cppblog.com/yg2362/archive/2012/09/23/191746.html</guid><wfw:comment>http://www.cppblog.com/yg2362/comments/191746.html</wfw:comment><comments>http://www.cppblog.com/yg2362/archive/2012/09/23/191746.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yg2362/comments/commentRss/191746.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yg2362/services/trackbacks/191746.html</trackback:ping><description><![CDATA[如果你对能很快回答出unicode和utf-8的关系，你可以直接跳过这篇文章。下面我来说说两者的关系和转换。（本文使用符号2字代表所有的汉字，英文，数字等）<br />首先明确一点，UTF-8是UNICODE一种实现方式。<br />UNICODE：代表一种符号集合，它规定了一种符合的二进制表示，没有指明存储方式。(<a href="http://www.unicode.org/">http://www.unicode.org/</a>)<br />UTF-8:实现了UNICODE，使用多字节的存储方式。<br />我们先来考虑几个问题。<br />第一，如果使用单字节表示符号，很明显，完全不够用<br />第二，如果使用多字节表示符号，那么，机器在读取的时候，它怎么知道3个字节表示一个符号，还是表示3个符号<br />第三，如果使用2个字节表示一个符号，首先，最多能表示65535个字符还是会不够用，就算够用，比如ASCII码这类仅需1个字节就可以表示的符号，用2个字节表示，浪费空间了。<br />因此，UTF-8孕育而生。<br />首先UTF-8使用变长表示符号，简单的说，有的时候用1个字节表示符号，有的时候用2个字节表示符号，这样解决了浪费空间的问题。那么，如何解决第二个问题的呢，我们得了解下UFT-8的编码规则。<br />1.对于单字节的符号，字节第一个为0，后面7为为这个符号的unicode码<br />2.对于N字节的符号(N&gt;1),第一个字节前N位为1，第N+1位为0，后面字节的前两位设为10,剩下可编码的位，为该符号的UNICODE编码。<br />这里我从网上找了一副图<br />&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #111111; font-family: 'Courier New', Courier, monospace; font-size: 16px; line-height: 28px; word-spacing: 2px; background-color: #e0dfcc; ">Unicode符号范围 | UTF-8编码方式</span><br style="color: #111111; font-family: 'Courier New', Courier, monospace; font-size: 16px; line-height: 28px; word-spacing: 2px; background-color: #e0dfcc; " />&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #111111; font-family: 'Courier New', Courier, monospace; font-size: 16px; line-height: 28px; word-spacing: 2px; background-color: #e0dfcc; ">(十六进制) | （二进制）</span><br style="color: #111111; font-family: 'Courier New', Courier, monospace; font-size: 16px; line-height: 28px; word-spacing: 2px; background-color: #e0dfcc; " /><span style="color: #111111; font-family: 'Courier New', Courier, monospace; font-size: 16px; line-height: 28px; word-spacing: 2px; background-color: #e0dfcc; ">0000 0000-0000 007F&nbsp;</span><span style="color: #111111; font-family: 'Courier New', Courier, monospace; font-size: 16px; line-height: 28px; word-spacing: 2px; background-color: #e0dfcc; ">| 0xxxxxxx</span><br style="color: #111111; font-family: 'Courier New', Courier, monospace; font-size: 16px; line-height: 28px; word-spacing: 2px; background-color: #e0dfcc; " /><span style="color: #111111; font-family: 'Courier New', Courier, monospace; font-size: 16px; line-height: 28px; word-spacing: 2px; background-color: #e0dfcc; ">0000 0080-0000 07FF | 110xxxxx 10xxxxxx</span><br style="color: #111111; font-family: 'Courier New', Courier, monospace; font-size: 16px; line-height: 28px; word-spacing: 2px; background-color: #e0dfcc; " /><span style="color: #111111; font-family: 'Courier New', Courier, monospace; font-size: 16px; line-height: 28px; word-spacing: 2px; background-color: #e0dfcc; ">0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx</span><br style="color: #111111; font-family: 'Courier New', Courier, monospace; font-size: 16px; line-height: 28px; word-spacing: 2px; background-color: #e0dfcc; " /><span style="color: #111111; font-family: 'Courier New', Courier, monospace; font-size: 16px; line-height: 28px; word-spacing: 2px; background-color: #e0dfcc; ">0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx<br /></span>下面我具体解释下这幅图。<br />首先看第一行，它的意思是00000000到0000007F的UNICODE编码，对应的UTF-8的编码方式为0XXXXXXX(X表示可编码位，不足的补0)。<br />第二行表示00000080到000007FF的UNICODE编码，对应的UTF-8的编码方式为110XXXXX 10XXXXXX。以此类推<br />那么，问题是，这个范围是怎么定的？<br />很简单，我们还是从第一行说起。007F，实际有效位只有7位，所以，0xxxxxxx就足矣。但是0800开始，有效位至少为8位，我们得增加一个字节，按照UTF-8的规定，2字节的表示方式为110XXXXX 10XXXXXX，我们的编码位为11位(X的个数)，所以，我们最多可以表示UNICODE编码位11位的字符，也就是07FF。07FF过了就是0800，有效位至少为12位，我们得用3字节来表示，按照UTF-8的规定，1110XXXX 10XXXXXX 10XXXXXX，最大编码位为16位，也就是FFFF，最后一行我就不再解释了。<br />通过上面这个过程我们了解了，UNICODE转UTF-8的过程，当然，逆过来就是UTF-8转换成UNICODE。<br />我们通过一个例子来演示上面的过程。汉字&#8220;杨&#8221;，UNICODE的编码位0x6768，二进制形式为0110011101101000，根据上面的图，我们知道它属于第三行，因此，它应该放入1110XXXX 10XXXXXX 10XXXXXX的模板中，结果是11100110&nbsp;10011101&nbsp;10101000，十六进制表示为E69DA8。<br />另外设计编码问题，我们绕不开另一个问题，就是大端小端的问题，不过这个问题，网上资料很多，也很好实践，这里我就不多啰嗦了。<img src ="http://www.cppblog.com/yg2362/aggbug/191746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yg2362/" target="_blank">梨树阳光</a> 2012-09-23 22:56 <a href="http://www.cppblog.com/yg2362/archive/2012/09/23/191746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++复习笔记---浅谈拷贝构造函数和赋值构造函数</title><link>http://www.cppblog.com/yg2362/archive/2012/08/31/188919.html</link><dc:creator>梨树阳光</dc:creator><author>梨树阳光</author><pubDate>Fri, 31 Aug 2012 09:13:00 GMT</pubDate><guid>http://www.cppblog.com/yg2362/archive/2012/08/31/188919.html</guid><wfw:comment>http://www.cppblog.com/yg2362/comments/188919.html</wfw:comment><comments>http://www.cppblog.com/yg2362/archive/2012/08/31/188919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yg2362/comments/commentRss/188919.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yg2362/services/trackbacks/188919.html</trackback:ping><description><![CDATA[<p style="margin:0in;font-size:11.0pt"><span style="font-family:Calibri">1.</span><span style="font-family:SimSun">拷贝构造函数的形式</span></p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:SimSun">对于类</span><span style="font-family:Calibri">X</span><span style="font-family:SimSun">，如果它的函数形式如下</span></p>  <p style="margin: 0in; font-family: Calibri; font-size: 11pt; ">a) X&amp;</p>  <p style="margin: 0in; font-family: Calibri; font-size: 11pt; ">b) const X&amp;</p>  <p style="margin: 0in; font-family: Calibri; font-size: 11pt; ">c) volatile X&amp;</p>  <p style="margin: 0in; font-family: Calibri; font-size: 11pt; ">d) const volatile X&amp;</p>  <p style="margin: 0in; font-size: 11pt; "><span style="font-family: Monaco">且没有其他参数或其他参数都有默认值</span><span style="font-family:Calibri">,</span><span style="font-family:Monaco">那么这个函数是拷贝构造函数</span></p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:Calibri">X::X(const X&amp;);</span><span style="font-family:SimSun">是拷贝构造函数</span></p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:Calibri">X::X(const X&amp;,int val = 10);</span><span style="font-family: SimSun">是拷贝构造函数</span></p>  <p style="margin:0in;font-family:Calibri;font-size:11.0pt">&nbsp;</p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:Calibri">2.</span><span style="font-family:SimSun">一个类中可以存在超过一个拷贝构造函数</span></p>  <p style="margin:0in;font-family:Calibri;font-size:11.0pt">class&nbsp;X&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</p>  <p style="margin:0in;font-family:Calibri;font-size:11.0pt">public:&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</p>  <p style="margin:0in;font-family:Calibri;font-size:11.0pt">&nbsp;&nbsp;X(const&nbsp;X&amp;);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</p>  <p style="margin:0in;font-family:Calibri;font-size:11.0pt">&nbsp;&nbsp;X(X&amp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#339966">//&nbsp;OK</span>&nbsp;&nbsp;&nbsp;</p>  <p style="margin:0in;font-family:Calibri;font-size:11.0pt">};&nbsp;</p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:宋体">编译器根据实际情况调用</span><span style="font-family:Calibri">const</span><span style="font-family: 宋体">拷贝构造函数或非</span><span style="font-family:Calibri">const</span><span style="font-family:宋体">的拷贝构造函数</span></p>  <p style="margin:0in;font-family:Calibri;font-size:11.0pt">&nbsp;</p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:Calibri">3.</span><span style="font-family:宋体">默认的拷贝构造函数行为</span></p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:Calibri">a)</span><span style="font-family:宋体">先调用父类的拷贝构造函数</span></p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:Calibri">b)</span><span style="font-family:宋体">如果数据成员为一个类的实例，则调用该类的拷贝构造函数</span></p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:Calibri">c)</span><span style="font-family:宋体">其他成员按位拷贝</span></p>  <p style="margin:0in;font-family:宋体;font-size:11.0pt">&nbsp;</p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:Calibri">4.</span><span style="font-family:宋体">默认的赋值构造函数行为</span></p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:Calibri">a)</span><span style="font-family:宋体">先调用父类的赋值构造函数</span></p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:Calibri">b)</span><span style="font-family:宋体">如果数据成员为一个类的实例，则调用该类的赋值构造函数</span></p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:Calibri">&nbsp;c)</span><span style="font-family:宋体">其他成员按位拷贝</span></p>  <p style="margin:0in;font-family:宋体;font-size:11.0pt">&nbsp;</p>  <p style="margin:0in;font-size:11.0pt"><span style="font-family:Calibri">5.</span><span style="font-family:宋体">提供显示的拷贝和赋值构造函数</span></p>  <p style="margin:0in;font-family:SimSun;font-size:11.0pt">基本的原则是子类一定要调用父类的相应函数，参考方式</p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">Derive(const Derive&amp; obj):<span style="background:yellow;">Base(obj)</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">{</p>  <p style="margin:0in;margin-left:.375in;font-family:Calibri;font-size:10.0pt">&#8230;...</p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">}</p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">&nbsp;</p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">Derive&amp; operator =(const Derive &amp;obj)</p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">{</p>  <p style="margin:0in;margin-left:.375in;font-family:SimSun;font-size:10.0pt">if ( this == &amp;obj )</p>  <p style="margin:0in;margin-left:.75in;font-family:SimSun;font-size:10.0pt">return *this;</p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">&nbsp;</p>  <p style="margin:0in;margin-left:.375in;font-size:10.0pt"><span style="font-family:Calibri">//</span><span style="font-family:SimSun">方式一</span></p>  <p style="margin:0in;margin-left:.375in;font-family:SimSun;font-size:10.0pt"><span style="background:yellow;">Base::operator =(obj);</span></p>  <p style="margin:0in;margin-left:.375in;font-family:SimSun;font-size:10.0pt">&nbsp;</p>  <p style="margin:0in;margin-left:.375in;font-size:10.0pt"><span style="font-family:Calibri">//</span><span style="font-family:SimSun">方式二</span></p>  <p style="margin:0in;margin-left:.375in;font-size:10.0pt"><span style="font-family:SimSun;background:yellow;">static_cast&lt;Base</span><span style="font-family:Calibri;background:yellow;">&amp;</span><span style="font-family:SimSun;background:yellow;">&gt;(*this) = obj;</span></p>  <p style="margin:0in;margin-left:.375in;font-family:SimSun;font-size:10.0pt">return *this;</p>  <p style="margin:0in;font-family:SimSun;font-size:10.0pt">}<br /><br />另外当你的成员变量有const或者引用，系统无法为你提供默认的拷贝和赋值构造函数，我们必须自己处理这些特殊的情况<br /><br /></p><img src ="http://www.cppblog.com/yg2362/aggbug/188919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yg2362/" target="_blank">梨树阳光</a> 2012-08-31 17:13 <a href="http://www.cppblog.com/yg2362/archive/2012/08/31/188919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++复习笔记---类的函数指针和普通函数指针</title><link>http://www.cppblog.com/yg2362/archive/2012/08/14/187183.html</link><dc:creator>梨树阳光</dc:creator><author>梨树阳光</author><pubDate>Tue, 14 Aug 2012 09:17:00 GMT</pubDate><guid>http://www.cppblog.com/yg2362/archive/2012/08/14/187183.html</guid><wfw:comment>http://www.cppblog.com/yg2362/comments/187183.html</wfw:comment><comments>http://www.cppblog.com/yg2362/archive/2012/08/14/187183.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yg2362/comments/commentRss/187183.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yg2362/services/trackbacks/187183.html</trackback:ping><description><![CDATA[我们在类里面会定义成员函数，同时我们也希望定义成员函数指针。因此需要解决3个问题，第一怎么定义类的函数指针，第二赋值，第三使用。<br />
我定义一个类，<br />
<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;A<br />
{<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;add(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;mul(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;div(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">);<br />
};<br />
<br />
</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;A::add(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;b)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;a&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;b;<br />
}<br />
<br />
</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;A::mul(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;b)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;a&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;b;<br />
}<br />
<br />
</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;A::div(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;b)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;(b&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;a</span><span style="color: #000000; ">/</span><span style="color: #000000; ">b&nbsp;:&nbsp;a);<br />
}</span></div>
我现在想要定义一个指针，指向A类型中返回值为int，参数为两个int的函数指针。熟悉C的同学马上会写出typedef int (*oper)(int,int)。但是这个用到C++里就有问题了，<br />
因为我们知道，类的非static成员方法实际上还有this指针的参数。比如add方法，它实际的定义可能会这样int add(A* this,int a,int b);因此，我们不能简单把C语言里的那套东西搬过来，我们需要重新定义这种类型的指针。正确做法是加上类型，typedef int (A::*Action)(int,int)<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">typedef&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;(A::</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Action)(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">);<br />
<br />
</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Action&nbsp;p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">A::add;<br />
&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;(a.</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p)(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
}</span></div>
<div><span style="font-size: 13px; "><span style="color: #000000; ">Action&nbsp;p&nbsp;</span><span style="color: #000000; ">=</span>&nbsp;<span style="color: #000000; ">&amp;</span><span style="color: #000000; ">A::add;这个就是赋值语句<br />
调用的时候注意，直接这样(*p)(1,2)是不行的，它必须绑定到一个对象上</span></span><span style="color: #000000; ">(a.</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p)(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);我们也可以把类的函数指针定义在类的声明里。<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;A<br />
{<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;add(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;mul(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;div(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;(A::</span><span style="color: #000000; ">*</span><span style="color: #000000; ">oper)(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">);<br />
};</span></div>
</span></div>
上面这种方式是针对非static成员函数的，那么static成员函数的函数指针应该怎么定义呢，还能用上面这种方式吗？我们知道static成员函数是没有this指针的，所以不会加上的类的限定，它的函数指针定义方式和C里面的函数指针定义方式一样的。<br />
<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;A<br />
{<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;add(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;mul(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;div(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">);<br />
<br />
&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;sub(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">);<br />
};<br />
<br />
</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;A::sub(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;b)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;a&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;b;<br />
}<br />
<br />
</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">pp)(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">A::sub;<br />
&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">pp)(</span><span style="color: #000000; ">10</span><span style="color: #000000; ">,</span><span style="color: #000000; ">5</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
}</span></div>总结起来，非static成员函数的函数指针需要加上类名，而static的成员函数的函数指针和普通的函数指针一样，没有什么区别。<br />另外注意一点的是<br />如果函数指针定义在类中，调用的时候有点区别。<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;A<br />{<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;add(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;mul(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;div(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;(A::</span><span style="color: #000000; ">*</span><span style="color: #000000; ">pfunc)(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">);<br />};<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;a.pfunc&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">A::add;<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;(a.</span><span style="color: #000000; ">*</span><span style="color: #000000; ">(a.pfunc))(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}</span></div><img src ="http://www.cppblog.com/yg2362/aggbug/187183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yg2362/" target="_blank">梨树阳光</a> 2012-08-14 17:17 <a href="http://www.cppblog.com/yg2362/archive/2012/08/14/187183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++复习笔记---初始化列表</title><link>http://www.cppblog.com/yg2362/archive/2012/08/14/187133.html</link><dc:creator>梨树阳光</dc:creator><author>梨树阳光</author><pubDate>Tue, 14 Aug 2012 02:24:00 GMT</pubDate><guid>http://www.cppblog.com/yg2362/archive/2012/08/14/187133.html</guid><wfw:comment>http://www.cppblog.com/yg2362/comments/187133.html</wfw:comment><comments>http://www.cppblog.com/yg2362/archive/2012/08/14/187133.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/yg2362/comments/commentRss/187133.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yg2362/services/trackbacks/187133.html</trackback:ping><description><![CDATA[<div><span style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20px; "><span style="font-size: 10pt; ">很久没有碰C++，下个项目要开始使用C++，所以很多东西需要捡起来重新看看。从今天起记录一些笔记，方便自己今后查阅。言归正传，先从构造函数的初始化列表说起。我把这个知识点细化成3个问题，1.为什么要有初始化列表，它和构造函数中初始化有什么不一样。2.初始化的顺序。3.一些注意的细节。</span><br /><span style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; 先说第一个问题。我们有两个东西，是必须在初始化列表里完成的，一个是const修饰的变量，一个是引用。这点我就不细说了，查阅资料的都可以找到。下面我具体说说类成员。</span><br /><div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 1035px; word-break: break-all; "><span style="color: #000000; "><div><span style="font-size: 10pt; ">class Test1<div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: 10pt; ">{</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: 10pt; ">public:</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span><span style="font-size: 10pt; ">Test1()</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span><span style="font-size: 10pt; ">{</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span><span style="font-size: 10pt; ">cout &lt;&lt; "Test1 default constructor" &lt;&lt; endl;</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span><span style="font-size: 10pt; ">}</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span><span style="font-size: 10pt; ">Test1(int i)</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span><span style="font-size: 10pt; ">{</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span><span style="font-size: 10pt; ">cout &lt;&lt; "Test1 value constructor" &lt;&lt; endl;</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span><span style="font-size: 10pt; ">}</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span><span style="font-size: 10pt; ">Test1(const Test1 &amp;obj)</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span><span style="font-size: 10pt; ">{</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span><span style="font-size: 10pt; ">cout &lt;&lt; "Test1</span><span style="font-size: 10pt; ">&nbsp;copy con</span><span style="font-size: 10pt; ">structor" &lt;&lt; endl;</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span><span style="font-size: 10pt; ">}</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span><span style="font-size: 10pt; ">Test1&amp; operator = (const Test1 &amp;obj)</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span><span style="font-size: 10pt; ">{</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span><span style="font-size: 10pt; ">cout &lt;&lt; "Test1 = constructor" &lt;&lt; endl;</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span><span style="font-size: 10pt; ">return *this;</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span><span style="font-size: 10pt; ">}</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span><span style="font-size: 10pt; ">~Test1()</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span><span style="font-size: 10pt; ">{</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span><span style="font-size: 10pt; ">cout &lt;&lt; "Test1 destructor" &lt;&lt; endl;</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span><span style="font-size: 10pt; ">}</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: 10pt; ">};</span></div></div></span></div></span></div>&nbsp;<span style="font-size: 10pt; ">我定义一个类，然后再定义一个类，其中包含Test1</span><br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 1035px; word-break: break-all; background-color: #eeeeee; "><span style="color: #0000ff; font-size: 10pt; ">class</span><span style="color: #000000; font-size: 10pt; ">&nbsp;Test2<br /></span><span style="color: #000000; font-size: 10pt; ">{<br /></span><span style="color: #0000ff; font-size: 10pt; ">public</span><span style="color: #000000; font-size: 10pt; ">:<br /></span><span style="color: #000000; font-size: 10pt; ">&nbsp;&nbsp;&nbsp;&nbsp;Test2()<br /></span><span style="color: #000000; font-size: 10pt; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #000000; font-size: 10pt; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1&nbsp;</span><span style="color: #000000; font-size: 10pt; ">=</span><span style="color: #000000; font-size: 10pt; ">&nbsp;Test1(</span><span style="color: #000000; font-size: 10pt; ">1</span><span style="color: #000000; font-size: 10pt; ">);<br /></span><span style="color: #000000; font-size: 10pt; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /></span><span style="color: #0000ff; font-size: 10pt; ">private</span><span style="color: #000000; font-size: 10pt; ">:<br /></span><span style="color: #000000; font-size: 10pt; ">&nbsp;&nbsp;&nbsp;&nbsp;Test1&nbsp;t1;<br /></span><span style="color: #000000; font-size: 10pt; ">};&nbsp;</span></div><span style="font-size: 10pt; ">我们在构造函数中初始化Test1，我们看看运行结果</span><br /><div><div><div><div><span style="font-size: 10pt; ">Test1 default constructor</span></div><div><span style="font-size: 10pt; ">Test1 value constructor</span></div><div><span style="font-size: 10pt; ">Test1 = constructor</span></div><div><span style="font-size: 10pt; ">Test1 destructor</span></div><div><span style="font-size: 10pt; ">Test1 destructor</span><br /><span style="font-size: 10pt; ">我们分析下这个输出。</span><span style="font-size: 10pt; ">Test1 default constructor，这说明在进入Test1构造函数之前，已经初始化了t1成员，并且调用的是无参构造函数。</span><span style="font-size: 10pt; ">Test1 value constructor这个是Test1(1)创建出来的对象。</span><span style="font-size: 10pt; ">Test1 = constructor，这个表示条用了拷贝构造函数，</span><span style="font-size: 10pt; ">Test1 destructor这个表示Test1(1)这个临时对象的析构，</span><span style="font-size: 10pt; ">Test1 destructor这个表示是t1这个成员对象的析构。从上面的结果来看，</span><span style="font-size: 10pt; ">构造函数中</span><span style="font-size: 13px; "><span style="color: #000000; font-size: 10pt; ">t1&nbsp;</span><span style="color: #000000; font-size: 10pt; ">=</span><span style="color: #000000; font-size: 10pt; ">&nbsp;Test1(</span><span style="color: #000000; font-size: 10pt; ">1</span><span style="font-size: 10pt; ">);其实并不是真正意义是上的初始化，而是一次拷贝赋值。当进入构造函数内部之前，类成员会被默认构造函数初始化。如果说Test1是个很大的对象，这块会造成性能上的开销。所以，这点也是使用初始化列表的原因之一。<br />&nbsp; &nbsp; &nbsp; 第二我们再来说下顺序问题。简单的原则是初始化列表里的会先于构造函数中，初始化列表里会按照变量声明的顺序。我们具体看看下面的例子。<br /><span style="color: #0000ff; ">class</span><span style="color: #000000; ">&nbsp;Test3()</span><div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 1035px; word-break: break-all; ">{<br /><span style="color: #0000ff; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;Test3(</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">&nbsp;x,</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">&nbsp;y,</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">&nbsp;z):_z(z),_y(y)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /></span><span style="color: #0000ff; ">private</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">&nbsp;_x,_y,_z;<br />};</span></div>按照上面的说法，赋值的顺序是_y,_z,_x。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第三个是注意问题，每个成员只能在初始化列表里出现一次。<br /><span style="color: #0000ff; ">class</span><span style="color: #000000; ">&nbsp;Test3</span><div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 1035px; word-break: break-all; ">{<br /><span style="color: #0000ff; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;Test3(</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">&nbsp;x,</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">&nbsp;y,</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">&nbsp;z):_z(z),_y(y),_z(x)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /></span><span style="color: #0000ff; ">private</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">&nbsp;_x,_y,_z;<br />};</span></div>比如这种就是问题的。_z被初始化了2次。</span></span></div></div></div></div></span></div><img src ="http://www.cppblog.com/yg2362/aggbug/187133.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yg2362/" target="_blank">梨树阳光</a> 2012-08-14 10:24 <a href="http://www.cppblog.com/yg2362/archive/2012/08/14/187133.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>