﻿<?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>BlogJava-路漫漫其修远兮，吾将上下而求索-随笔分类-C++编程</title><link>http://www.blogjava.net/fhtdy2004/category/39265.html</link><description>经验浅薄，耐心积累；记性不好，记诸文字</description><language>zh-cn</language><lastBuildDate>Sat, 31 Oct 2009 19:26:35 GMT</lastBuildDate><pubDate>Sat, 31 Oct 2009 19:26:35 GMT</pubDate><ttl>60</ttl><item><title>char str[]与char *str一个小tip</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/08/05/289968.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Wed, 05 Aug 2009 08:57:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/08/05/289968.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/289968.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/08/05/289968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/289968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/289968.html</trackback:ping><description><![CDATA[关于const_cast &nbsp; &nbsp; <br />
&nbsp; &nbsp; const char str[] = "abc"; <br />
&nbsp; &nbsp; char * s = const_cast&lt;char *&gt;(str); <br />
&nbsp; &nbsp; s[0] = 'A'; <br />
&nbsp;<br />
&nbsp; &nbsp; cout&lt;&lt;s&lt;&lt;endl; &nbsp; &nbsp;//输出Abc <br />
但是这样就不行了： <br />
&nbsp; &nbsp;const char *str = "abc"; <br />
&nbsp; &nbsp; char * s = const_cast&lt;char *&gt;(str); <br />
&nbsp; &nbsp; s[0] = 'A'; <br />
&nbsp;<br />
&nbsp; &nbsp; cout&lt;&lt;s&lt;&lt;endl; &nbsp; &nbsp;//编译能通过，但是执行就报错。<br />
<br />
<font class="f006">: const char str[] = "abc"; &nbsp; &nbsp; &nbsp; &nbsp;abc存储在堆栈中；</font> <br />
<font class="f006">: const char *str = "abc"; &nbsp; &nbsp; &nbsp; &nbsp; abc存储在静态存储区；</font> <br />
准确的说，上面两个&#8220;abc"都是存储在静态存储区，即常量区。常量区是可读不可写的。所以任何试图对常量区进行写的操作都是非法的，当然了，这也不是一定不可写的，你可以采取某种渠道改变常量区的内存属性，比如改变pe相关节的属性就可以对常量区进行读写，当然了，这个目前可以忽略。。。 <br />
那么为什么str[] = "abc"; &nbsp; &nbsp; &nbsp; &nbsp;可以写呢？答案就在str[] = "abc";会有一个额外的拷贝过程，即把常量区的 "abc"拷贝到栈内存去，所以就可以写了。 <br />
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/289968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-08-05 16:57 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/08/05/289968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++引用小结（转 ）</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/06/07/280417.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sun, 07 Jun 2009 04:23:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/06/07/280417.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/280417.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/06/07/280417.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/280417.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/280417.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 介绍C++引用的基本概念，通过详细的应用分析与说明，对引用进行全面、透彻地阐述 &nbsp;&nbsp;<a href='http://www.blogjava.net/fhtdy2004/archive/2009/06/07/280417.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/280417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-06-07 12:23 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/06/07/280417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中将构造函数或析构函数定义为private</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/30/278971.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Fri, 29 May 2009 16:22:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/30/278971.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/278971.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/30/278971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/278971.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/278971.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: C++中将构造函数或析构函数定义为private&nbsp;&nbsp;<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/30/278971.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/278971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-30 00:22 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/30/278971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++的static关键字</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/30/278968.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Fri, 29 May 2009 16:06:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/30/278968.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/278968.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/30/278968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/278968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/278968.html</trackback:ping><description><![CDATA[<p>　　C++的static有两种用法：面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数，不涉及类；后者主要说明static在类中的作用。</p>
<p><strong>一、面向过程设计中的static</strong></p>
<p>1、静态全局变量</p>
<p>在全局变量前，加上关键字static，该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子，如下： </p>
<pre>//Example 1
#include &lt;iostream.h&gt;
void fn();
static int n; //定义静态全局变量
void main()
{
n=20;
cout&lt;&lt;n&lt;&lt;endl;
fn();
}
void fn()
{
n++;
cout&lt;&lt;n&lt;&lt;endl;
}
</pre>
静态全局变量有以下特点：
<ul>
    <li>该变量在全局数据区分配内存；
    <li>未经初始化的静态全局变量会被程序自动初始化为0（自动变量的值是随机的，除非它被显式初始化）；
    <li>静态全局变量在声明它的整个文件都是可见的，而在文件之外是不可见的；　 </li>
</ul>
静态变量都在全局数据区分配内存，包括后面将要提到的静态局部变量。对于一个完整的程序，在内存中的分布情况如下图：<br />
　
<table id="table1" width="10%" border="1">
    <tbody>
        <tr>
            <td>代码区</td>
        </tr>
        <tr>
            <td>全局数据区</td>
        </tr>
        <tr>
            <td>堆区</td>
        </tr>
        <tr>
            <td>栈区</td>
        </tr>
    </tbody>
</table>
<p>　　一般程序的由new产生的动态数据存放在堆区，函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间，静态数据（即使是函数内部的静态局部变量）也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。细心的读者可能会发现，Example 1中的代码中将 </p>
<pre>	static int n; //定义静态全局变量</pre>
改为
<pre>	int n; //定义全局变量</pre>
程序照样正常运行。<br />
的确，定义全局变量就可以实现变量在文件中的共享，但定义静态全局变量还有以下好处：
<ul>
    <li>静态全局变量不能被其它文件所用；
    <li>其它文件中可以定义相同名字的变量，不会发生冲突； </li>
</ul>
<p>您可以将上述示例代码改为如下：<br />
</p>
<pre>//Example 2
//File1
#include &lt;iostream.h&gt;
void fn();
static int n; //定义静态全局变量
void main()
{
n=20;
cout&lt;&lt;n&lt;&lt;endl;
fn();
}
//File2
#include &lt;iostream.h&gt;
extern int n;
void fn()
{
n++;
cout&lt;&lt;n&lt;&lt;endl;
}
</pre>
编译并运行Example 2，您就会发现上述代码可以分别通过编译，但运行时出现错误。试着将
<pre>static int n; //定义静态全局变量
</pre>
改为
<pre>int n; //定义全局变量
</pre>
再次编译运行程序，细心体会全局变量和静态全局变量的区别。
<p>2、静态局部变量</p>
<p>在局部变量前，加上关键字static，该变量就被定义成为一个静态局部变量。 </p>
<p>我们先举一个静态局部变量的例子，如下： </p>
<pre>//Example 3
#include &lt;iostream.h&gt;
void fn();
void main()
{
fn();
fn();
fn();
}
void fn()
{
static n=10;
cout&lt;&lt;n&lt;&lt;endl;
n++;
}
</pre>
　　通常，在函数体内定义了一个变量，每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体，系统就会收回栈内存，局部变量也相应失效。<br />
　　但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来，变量已经不再属于函数本身了，不再仅受函数的控制，给程序的维护带来不便。<br />
　　静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区，而不是保存在栈中，每次的值保持到下一次调用，直到下次赋新值。
<p>静态局部变量有以下特点：</p>
<ul>
    <li>该变量在全局数据区分配内存；
    <li>静态局部变量在程序执行到该对象的声明处时被首次初始化，即以后的函数调用不再进行初始化；
    <li>静态局部变量一般在声明处初始化，如果没有显式初始化，会被程序自动初始化为0；
    <li>它始终驻留在全局数据区，直到程序运行结束。但其作用域为局部作用域，当定义它的函数或语句块结束时，其作用域随之结束； </li>
</ul>
<p>3、静态函数</p>
<p>　　在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同，它只能在声明它的文件当中可见，不能被其它文件使用。</p>
<p>静态函数的例子： </p>
<pre>//Example 4
#include &lt;iostream.h&gt;
static void fn();//声明静态函数
void main()
{
fn();
}
void fn()//定义静态函数
{
int n=10;
cout&lt;&lt;n&lt;&lt;endl;
}
</pre>
定义静态函数的好处：
<ul>
    <li>静态函数不能被其它文件所用；
    <li>其它文件中可以定义相同名字的函数，不会发生冲突； </li>
</ul>
<p><strong>二、面向对象的static关键字（类中的static关键字）</strong></p>
<p>1、静态数据成员</p>
<p>在类内数据成员的声明前加上关键字static，该数据成员就是类内的静态数据成员。先举一个静态数据成员的例子。 </p>
<pre>//Example 5
#include &lt;iostream.h&gt;
class Myclass
{
public:
Myclass(int a,int b,int c);
void GetSum();
private:
int a,b,c;
static int Sum;//声明静态数据成员
};
int Myclass::Sum=0;//定义并初始化静态数据成员
Myclass::Myclass(int a,int b,int c)
{
this-&gt;a=a;
this-&gt;b=b;
this-&gt;c=c;
Sum+=a+b+c;
}
void Myclass::GetSum()
{
cout&lt;&lt;"Sum="&lt;&lt;Sum&lt;&lt;endl;
}
void main()
{
Myclass M(1,2,3);
M.GetSum();
Myclass N(4,5,6);
N.GetSum();
M.GetSum();
}
</pre>
可以看出，静态数据成员有以下特点：
<ul>
    <li>对于非静态数据成员，每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个，静态数据成员在程序中也只有一份拷贝，由该类型的所有对象共享访问。也就是说，静态数据成员是该类的所有对象所共有的。对该类的多个对象来说，静态数据成员只分配一次内存，供所有对象共用。所以，静态数据成员的值对每个对象都是一样的，它的值可以更新；
    <li>静态数据成员存储在全局数据区。静态数据成员定义时要分配空间，所以不能在类声明中定义。在Example 5中，语句int Myclass::Sum=0;是定义静态数据成员；
    <li>静态数据成员和普通数据成员一样遵从public,protected,private访问规则；
    <li>因为静态数据成员在全局数据区分配内存，属于本类的所有对象共享，所以，它不属于特定的类对象，在没有产生类对象时其作用域就可见，即在没有产生类的实例时，我们就可以操作它；
    <li>静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为：<br />
    ＜数据类型＞＜类名＞::＜静态数据成员名＞=＜值＞
    <li>类的静态数据成员有两种访问形式：<br />
    ＜类对象名＞.＜静态数据成员名＞ 或 ＜类类型名＞::＜静态数据成员名＞<br />
    如果静态数据成员的访问权限允许的话（即public的成员），可在程序中，按上述格式来引用静态数据成员 ；
    <li>静态数据成员主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类，每个实例的利息都是相同的。所以，应该把利息设为存款类的静态数据成员。这有两个好处，第一，不管定义多少个存款类对象，利息数据成员都共享分配在全局数据区的内存，所以节省存储空间。第二，一旦利息需要改变时，只要改变一次，则所有存款类对象的利息全改变过来了；
    <li>同全局变量相比，使用静态数据成员有两个优势： </li>
</ul>
<ol>
    <li>静态数据成员没有进入程序的全局名字空间，因此不存在与程序中其它全局名字冲突的可能性；
    <li>可以实现信息隐藏。静态数据成员可以是private成员，而全局变量不能；<br />
    </li>
</ol>
2、静态成员函数
<p>　　与静态数据成员一样，我们也可以创建一个静态成员函数，它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样，都是类的内部实现，属于类定义的一部分。普通的成员函数一般都隐含了一个this指针，this指针指向类的对象本身，因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下，this是缺省的。如函数fn()实际上是this-&gt;fn()。但是与普通函数相比，静态成员函数由于不是与任何的对象相联系，因此它不具有this指针。从这个意义上讲，它无法访问属于类对象的非静态数据成员，也无法访问非静态成员函数，它只能调用其余的静态成员函数。下面举个静态成员函数的例子。 </p>
<pre>//Example 6
#include &lt;iostream.h&gt;
class Myclass
{
public:
Myclass(int a,int b,int c);
static void GetSum();/声明静态成员函数
private:
int a,b,c;
static int Sum;//声明静态数据成员
};
int Myclass::Sum=0;//定义并初始化静态数据成员
Myclass::Myclass(int a,int b,int c)
{
this-&gt;a=a;
this-&gt;b=b;
this-&gt;c=c;
Sum+=a+b+c; //非静态成员函数可以访问静态数据成员
}
void Myclass::GetSum() //静态成员函数的实现
{
//	cout&lt;&lt;a&lt;&lt;endl; //错误代码，a是非静态数据成员
cout&lt;&lt;"Sum="&lt;&lt;Sum&lt;&lt;endl;
}
void main()
{
Myclass M(1,2,3);
M.GetSum();
Myclass N(4,5,6);
N.GetSum();
Myclass::GetSum();
}
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
关于静态成员函数，可以总结为以下几点：
<p>&nbsp;</p>
<ul>
    <li>出现在类体外的函数定义不能指定关键字static；
    <li>静态成员之间可以相互访问，包括静态成员函数访问静态数据成员和访问静态成员函数；
    <li>非静态成员函数可以任意地访问静态成员函数和静态数据成员；
    <li>静态成员函数不能访问非静态成员函数和非静态数据成员；
    <li>由于没有this指针的额外开销，因此静态成员函数与类的全局函数相比速度上会有少许的增长；
    <li>调用静态成员函数，可以用成员访问操作符(.)和(-&gt;)为一个类的对象或指向类对象的指针调用静态成员函数，也可以直接使用如下格式：<br />
    ＜类名＞::＜静态成员函数名＞（＜参数表＞）<br />
    调用类的静态成员函数。 </li>
</ul>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/278968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-30 00:06 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/30/278968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>static全局变量与普通的全局变量有什么区别？static局部变量和普通局部变量有什么区别？static函数与普通函数有什么区别？</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/29/278958.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Fri, 29 May 2009 15:20:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/29/278958.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/278958.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/29/278958.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/278958.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/278958.html</trackback:ping><description><![CDATA[<p><span style="color: red"><strong>C语言中讲讲static变量和static函数有什么作用</strong></span><br />
static关键字有两种意思,你看上下文来判断 </p>
<p>1,表示变量是静态存储变量 <br />
表示变量存放在静态存储区. <br />
2,表示该变量是内部连接 <br />
(这种情况是指该变量不在任何{}之内,就象全局变量那样,这时候加上static) <br />
,也就是说在其它的.cpp文件中,该变量是不可见的(你不能用). </p>
<p>当static加在函数前面的时候 <br />
表示该函数是内部连接,之在本文件中有效,别的文件中不能应用该函数. <br />
不加static的函数默认为是全局的. <br />
也就是说在其他的.cpp中只要申明一下这个函数,就可以使用它. <br />
</p>
<p><span style="color: red"><strong>1、static全局变量与普通的全局变量有什么区别？static局部变量和普通局部变量有什么区别？static函数与普通函数有什么区别？</strong></span><br />
&nbsp;&nbsp;&nbsp; 答：全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式， 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序，当一个源程序由多个源文件组成时，非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域， 即只在定义该变量的源文件内有效， 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内，只能为该源文件内的函数公用， 因此可以避免在其它源文件中引起错误。<br />
&nbsp;&nbsp;&nbsp; 从以上分析可以看出， 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域， 限制了它的使用范围。<br />
&nbsp;&nbsp;&nbsp; static函数与普通函数作用域不同。static函数仅在本文件中使用。只在当前源文件中使用的函数应该说明为内部函数(static)，内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数，应该在一个头文件中说明，要使用这些函数的源文件要包含这个头文件<br />
&nbsp;&nbsp;&nbsp; static全局变量与普通的全局变量有什么区别：static全局变量只初使化一次，防止在其他文件单元中被引用;<br />
&nbsp;&nbsp;&nbsp; static局部变量和普通局部变量有什么区别：static局部变量只被初始化一次，下一次依据上一次结果值；<br />
&nbsp;&nbsp;&nbsp; static函数与普通函数有什么区别：static函数在内存中只有一份，普通函数在每个被调用中维持一份拷贝</p>
<p><span style="color: red"><strong>2、如何引用一个已经定义过的全局变量？</strong></span><br />
&nbsp;&nbsp;&nbsp;&nbsp; 答：extern<br />
&nbsp;&nbsp;&nbsp;&nbsp; 可以用引用头文件的方式，也可以用extern关键字，如果用引用头文件方式来引用某个在头文件中声明的全局变理，假定你将那个变写错了，那么在编译期间 会报错，如果你用extern方式引用时，假定你犯了同样的错误，那么在编译期间不会报错，而在连接期间报错。</p>
<p><span style="color: red"><strong>3、全局变量可不可以定义在可被多个.C文件包含的头文件中？为什么？</strong></span><br />
&nbsp;&nbsp;&nbsp; 答：可以，在不同的C文件中以static形式来声明同名全局变量。<br />
&nbsp;&nbsp;&nbsp; 可以在不同的C文件中声明同名的全局变量，前提是其中只能有一个C文件中对此变量赋初值，此时连接不会出错。</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/278958.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-29 23:20 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/29/278958.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>*转:C++ 对象的内存布局(下)</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/15/270922.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Fri, 15 May 2009 12:14:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/15/270922.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/270922.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/15/270922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/270922.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/270922.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/15/270922.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/270922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-15 20:14 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/15/270922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>*转：C++对象的内存布局(上)</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/15/270916.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Fri, 15 May 2009 11:16:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/15/270916.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/270916.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/15/270916.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/270916.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/270916.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: C++ 对象的内存布局(上)陈皓http://blog.csdn.net/haoel前言07年12月，我写了一篇《C++虚函数表解析》的文章，引起了大家的兴趣。有很多朋友对我的文章留了言，有鼓励我的，有批评我的，还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为，在上一篇文章中，我用了的示例都是非常简单的，主要是为了说明一些机理上的问题，也是...&nbsp;&nbsp;<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/15/270916.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/270916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-15 19:16 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/15/270916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++函数返回自由内存区间的对象的引用</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270125.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Mon, 11 May 2009 15:01:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270125.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/270125.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270125.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/270125.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/270125.html</trackback:ping><description><![CDATA[<span style="color: red"><strong>Effective C++<br />
条款31: 千万不要返回局部对象的引用，也不要返回函数内部用new初始化的指针的引用</strong></span><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"><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #000000">#include</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000">#include</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br />
</span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SimpleCat<br />
</span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #0000ff">public</span><span style="color: #000000">:<br />
</span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat(</span><span style="color: #0000ff">void</span><span style="color: #000000">);<br />
</span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;weight);<br />
</span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;GetAge(){</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;itsAge;}<br />
</span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;GetWeight(){</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;itsWeight;}<br />
</span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">14</span>&nbsp;<span style="color: #0000ff">private</span><span style="color: #000000">:<br />
</span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;itsAge;<br />
</span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;itsWeight;<br />
</span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">int&nbsp;itsAge=5;</span><span style="color: #008000">//</span><span style="color: #008000">1&gt;.\SimpleCat.cpp(14)&nbsp;:&nbsp;error&nbsp;C2864:&nbsp;&#8220;SimpleCat::itsAge&#8221;:&nbsp;只有静态常量整型数据成员才可以在类中初始化</span><span style="color: #008000"><br />
</span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">19</span>&nbsp;<span style="color: #0000ff">public</span><span style="color: #000000">:<br />
</span><span style="color: #008080">20</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">SimpleCat(</span><span style="color: #0000ff">void</span><span style="color: #000000">);<br />
</span><span style="color: #008080">21</span>&nbsp;<span style="color: #000000">};<br />
</span><span style="color: #008080">22</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">23</span>&nbsp;<span style="color: #000000">SimpleCat::SimpleCat(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br />
</span><span style="color: #008080">24</span>&nbsp;<span style="color: #000000">{<br />
</span><span style="color: #008080">25</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">SimpleCat&nbsp;constructor&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #0000ff">this</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br />
</span><span style="color: #008080">26</span>&nbsp;<span style="color: #000000">}<br />
</span><span style="color: #008080">27</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">28</span>&nbsp;<span style="color: #000000">SimpleCat::SimpleCat(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;weight)<br />
</span><span style="color: #008080">29</span>&nbsp;<span style="color: #000000">{<br />
</span><span style="color: #008080">30</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">SimpleCat&nbsp;constructor&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #0000ff">this</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br />
</span><span style="color: #008080">31</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;itsAge&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;<br />
</span><span style="color: #008080">32</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;itsWeight&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;weight;<br />
</span><span style="color: #008080">33</span>&nbsp;<span style="color: #000000">}<br />
</span><span style="color: #008080">34</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">35</span>&nbsp;<span style="color: #000000">SimpleCat::</span><span style="color: #000000">~</span><span style="color: #000000">SimpleCat(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br />
</span><span style="color: #008080">36</span>&nbsp;<span style="color: #000000">{<br />
</span><span style="color: #008080">37</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">SimpleCat&nbsp;destructor</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #0000ff">this</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br />
</span><span style="color: #008080">38</span>&nbsp;<span style="color: #000000">}<br />
</span><span style="color: #008080">39</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">40</span>&nbsp;<span style="color: #000000">SimpleCat&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">TheFunction();<br />
</span><span style="color: #008080">41</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">42</span>&nbsp;<span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />
</span><span style="color: #008080">43</span>&nbsp;<span style="color: #000000">{<br />
</span><span style="color: #008080">44</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat&nbsp;myCat;<br />
</span><span style="color: #008080">45</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">myCat.GetAge()</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;</span><span style="color: #008000">//</span><span style="color: #008000">这个值区别于java不是赋初值为0的,而是一个随机的值<br />
</span><span style="color: #008080">46</span>&nbsp;<span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;myCat.itsAge&lt;&lt;endl;</span><span style="color: #008000"><br />
</span><span style="color: #008080">47</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">48</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">------------------------</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br />
</span><span style="color: #008080">49</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">rCat&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;TheFunction();<br />
</span><span style="color: #008080">50</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rCat.GetAge();<br />
</span><span style="color: #008080">51</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">rCat&nbsp;is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">age</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">yeas&nbsp;old!</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br />
</span><span style="color: #008080">52</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">&amp;rCat:&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;&amp;</span><span style="color: #000000">rCat</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br />
</span><span style="color: #008080">53</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pCat&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">rCat;<br />
</span><span style="color: #008080">54</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">delete&nbsp;rCat;</span><span style="color: #008000">//</span><span style="color: #008000">不能对引用使用delete</span><span style="color: #008000"><br />
</span><span style="color: #008080">55</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;pCat;<br />
</span><span style="color: #008080">56</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">delete好像没有释放内存，怎么获取的还是原来的值<br />
</span><span style="color: #008080">57</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">可能在这个内存区域存放的还是原来的?先new&nbsp;string后再调用也没变，与编译器有关还是什么??</span><span style="color: #008000"><br />
</span><span style="color: #008080">58</span>&nbsp;<span style="color: #000000">&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&nbsp;</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">10</span><span style="color: #000000">;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
</span><span style="color: #008080">59</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080">60</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">想通过创建string对象来填充之前的内存区间，好像没用</span><span style="color: #008000"><br />
</span><span style="color: #008080">61</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">abcdefghijklmn</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">62</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">63</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">64</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">这时问题来了,rCat.getAge()为123了</span><span style="color: #008000"><br />
</span><span style="color: #008080">65</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pSecond&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleCat(</span><span style="color: #000000">123</span><span style="color: #000000">,</span><span style="color: #000000">444</span><span style="color: #000000">);<br />
</span><span style="color: #008080">66</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">67</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">delete&nbsp;pCat后再使用rCat引用会发生什么问题???</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br />
</span><span style="color: #008080">68</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">delete&nbsp;pCat后&nbsp;&amp;rCat</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;&amp;</span><span style="color: #000000">rCat</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br />
</span><span style="color: #008080">69</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">delete&nbsp;pCat后&nbsp;rCat.age</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">rCat.GetAge()</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br />
</span><span style="color: #008080">70</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">71</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">--------------------------</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br />
</span><span style="color: #008080">72</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat&nbsp;myCat2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;TheFunction();</span><span style="color: #008000">//</span><span style="color: #008000">这个会发生内存泄漏，在函数中申请的内存会得不到释放<br />
</span><span style="color: #008080">73</span>&nbsp;<span style="color: #008000">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">myCat2是通过默认的拷贝函数来进行初始化的</span><span style="color: #008000"><br />
</span><span style="color: #008080">74</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">myCat2的地址是&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;&amp;</span><span style="color: #000000">myCat2</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br />
</span><span style="color: #008080">75</span>&nbsp;<span style="color: #000000">&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><span style="color: #008080">76</span>&nbsp;<span style="color: #000000">}<br />
</span><span style="color: #008080">77</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">78</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">79</span>&nbsp;<span style="color: #008000">//</span><span style="color: #008000">这个函数在返回时，是否会创建一个临时引用变量???<br />
</span><span style="color: #008080">80</span>&nbsp;<span style="color: #008000">//</span><span style="color: #008000">TheFunctionTwo(SimpleCat&nbsp;&amp;simpleCat)这个函数在传递参数时是否会创建一个临时的引用变量<br />
</span><span style="color: #008080">81</span>&nbsp;<span style="color: #008000">//</span><span style="color: #008000">临时的引用变量的作用域范围是什么</span><span style="color: #008000"><br />
</span><span style="color: #008080">82</span>&nbsp;<span style="color: #000000">SimpleCat&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">TheFunction()<br />
</span><span style="color: #008080">83</span>&nbsp;<span style="color: #000000">{<br />
</span><span style="color: #008080">84</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pFrisky&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleCat(</span><span style="color: #000000">5</span><span style="color: #000000">,</span><span style="color: #000000">9</span><span style="color: #000000">);<br />
</span><span style="color: #008080">85</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">pFrisky:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">pFrisky</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br />
</span><span style="color: #008080">86</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pFrisky;<br />
</span><span style="color: #008080">87</span>&nbsp;<span style="color: #000000">}<br />
</span><span style="color: #008080">88</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">89</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">90</span>&nbsp;</div>
<br />
<p>函数TheFunction()的返回值被赋值给对SimpleCat类的一个引用,然后使用这个引用来获得对象的成员变量age的值<br />
为了证明函数TheFunction()在自由存储区中创建的对象被赋给了函数main()声明的引用，对rCat采取取址运算，很明显，它显示了其引用的对象的地址，并且和自由存储区中的对象的地址相匹配。<br />
这一切看上去都很正确，但是如何释放被占用的内存，对于引用是不能使用delete运算符的，一个笔记聪明的方法是声明另一个指针，并使用由rCat得到的地址对它进行初始化。这样做确实可以释放内存，避免了内存的泄漏，但是存在一个小问题，在delete pCat后，rCat引用又代表什么呢？？引用必须是一个实际对象的别名；如果引用一个空对象的话（现在就是这种情况）那么程序就是无效的。。</p>
<p>注意：不能过分去强调一个使用对空对象的引用的程序，也行能通过编译，但是即使程序通过了编译，它仍然是病态的，而且执行结果也是不可预料的</p>
<p>关于这个问题，存在这3种解决方案<br />
第1种是在第49行声明一个SimpleCat类对象，然后从函数TheFunction()中采取值传递的方式返回它的局部对象，这时不能在自由存储区来分配对象空间，不能使用new，<br />
第2种是在函数TheFunction()中声明一个位于自由存储区中的SimpleCat类的对象，但是让函数返回一个指向内存区域的指针，然后完成对对象的操作，调用函数可以删除这个指针<br />
第3种可行的方案，也是正确的，是在调用函数中声明对象，然后通过引用的方式把它传递给函数TheFunction()</p>
<br />
也意味在main函数中不能这样使用了<br />
<br />
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/270125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-11 23:01 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java对象的实例化过程,成员变量的初始化顺序</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270110.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Mon, 11 May 2009 13:16:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270110.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/270110.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/270110.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/270110.html</trackback:ping><description><![CDATA[&nbsp;
<p style="background: #eeeedd; margin: 7.5pt 0cm; text-align: left" align="left"><span style="font-size: 11pt; font-family: Verdana">JAVA<span style="font-family: 宋体">中子类对象的实例化过程</span></span></p>
<p style="background: #eeeedd; margin: 7.5pt 0cm; text-align: left" align="left"><span style="font-size: 11pt; font-family: Verdana">&nbsp;Person.java</span></p>
<p style="background: #e6e6e6; word-break: break-all; text-align: left" align="left"><span style="font-size: 11pt; font-family: Verdana"><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" width="11" border="0" v:shapes="_x0000_i1025" /><span style="color: blue">class</span><span style="color: black">&nbsp;Person<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image002.gif" width="11" border="0" v:shapes="_13_284_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif" width="11" border="0" v:shapes="_13_284_Closed_Image" /></span><span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1028" />&nbsp;</span><span style="color: blue">public</span><span style="color: black">&nbsp;String&nbsp;name&nbsp;=&nbsp;"not&nbsp;know";</span><strong><span style="color: green">//4</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1029" /></span>&nbsp;<span style="color: blue">public</span>&nbsp;<span style="color: blue">int</span><span style="color: black">&nbsp;age&nbsp;=&nbsp;-1&nbsp;;</span><strong><span style="color: green">//5</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1030" /></span>&nbsp;<span style="color: blue">public</span><span style="color: black">&nbsp;Person()<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.gif" width="11" border="0" v:shapes="_96_103_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image006.gif" width="11" border="0" v:shapes="_96_103_Closed_Image" />&nbsp;</span><span style="color: black">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.gif" width="11" border="0" v:shapes="_x0000_i1033" />&nbsp;}<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1060" />&nbsp;</span><span style="color: blue">public</span><span style="color: black">&nbsp;Person(String&nbsp;name&nbsp;,&nbsp;</span><span style="color: blue">int</span><span style="color: black">&nbsp;age<strong>)</strong></span><strong><span style="color: green">//3</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.gif" width="11" border="0" v:shapes="_147_195_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image006.gif" width="11" border="0" v:shapes="_147_195_Closed_Image" /></span>&nbsp;<span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1063" />&nbsp;&nbsp;</span><span style="color: blue">this</span><span style="color: black">.name&nbsp;=&nbsp;name&nbsp;;</span><strong><span style="color: green">//6</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1064" /></span><span style="color: black">&nbsp;&nbsp;</span><span style="color: blue">this</span><span style="color: black">.age&nbsp;=&nbsp;age;</span><strong><span style="color: green">//7</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.gif" width="11" border="0" v:shapes="_x0000_i1065" /></span><span style="color: black">&nbsp;}<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1066" />&nbsp;</span><span style="color: blue">public</span>&nbsp;<span style="color: blue">void</span><span style="color: black">&nbsp;showInfo()<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.gif" width="11" border="0" v:shapes="_222_282_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image006.gif" width="11" border="0" v:shapes="_222_282_Closed_Image" />&nbsp;</span><span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1069" />&nbsp;&nbsp;System.out.println("Name&nbsp;is&nbsp;:"+name+" Age&nbsp;is&nbsp;:"+age);<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.gif" width="11" border="0" v:shapes="_x0000_i1070" />&nbsp;}<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image008.gif" width="11" border="0" v:shapes="_x0000_i1037" />}<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" width="11" border="0" v:shapes="_x0000_i1038" /></span><span style="color: blue">class</span><span style="color: black">&nbsp;Student&nbsp;</span><span style="color: blue">extends</span><span style="color: black">&nbsp;Person<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image002.gif" width="11" border="0" v:shapes="_315_648_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif" width="11" border="0" v:shapes="_315_648_Closed_Image" /></span><span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1041" />&nbsp;</span><span style="color: blue">public</span><span style="color: black">&nbsp;String&nbsp;school&nbsp;=&nbsp;"not&nbsp;konwn"<strong>;</strong></span><strong><span style="color: green">//8</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1042" /></span><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue">public</span><span style="color: black">&nbsp;Student()<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.gif" width="11" border="0" v:shapes="_382_406_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image006.gif" width="11" border="0" v:shapes="_382_406_Closed_Image" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1045" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue">super</span><span style="color: black">();&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.gif" width="11" border="0" v:shapes="_x0000_i1046" />&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1047" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue">public</span><span style="color: black">&nbsp;Student&nbsp;(String&nbsp;name&nbsp;,</span><span style="color: blue">int</span><span style="color: black">&nbsp;age,&nbsp;String&nbsp;school)&nbsp;&nbsp;</span><strong><span style="color: green">//1</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.gif" width="11" border="0" v:shapes="_474_537_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image006.gif" width="11" border="0" v:shapes="_474_537_Closed_Image" /></span><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1050" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue">super</span><span style="color: black">(name,age);&nbsp;<strong>&nbsp;</strong></span><strong><span style="color: green">//2</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1051" /></span><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue">this</span><span style="color: black">.school&nbsp;=&nbsp;school<strong>;</strong></span><strong><span style="color: green">//9</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.gif" width="11" border="0" v:shapes="_x0000_i1052" /></span><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1053" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue">public</span>&nbsp;<span style="color: blue">void</span><span style="color: black">&nbsp;showInfo()<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.gif" width="11" border="0" v:shapes="_570_646_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image006.gif" width="11" border="0" v:shapes="_570_646_Closed_Image" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1056" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue">super</span><span style="color: black">.showInfo();<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1057" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("School&nbsp;is&nbsp;:"+school);<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.gif" width="11" border="0" v:shapes="_x0000_i1058" />&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image008.gif" width="11" border="0" v:shapes="_x0000_i1059" />}</span></span></p>
<p style="background: #eeeedd; margin: 7.5pt 0cm; text-align: left" align="left"><span style="font-size: 11pt; font-family: Verdana">AllTest.java</span></p>
<p style="background: #e6e6e6; word-break: break-all; text-align: left" align="left"><span style="font-size: 11pt; font-family: Verdana"><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" width="11" border="0" v:shapes="_x0000_i1071" /><span style="color: blue">class</span><span style="color: black">&nbsp;AllTest<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image002.gif" width="11" border="0" v:shapes="_14_123_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif" width="11" border="0" v:shapes="_14_123_Closed_Image" /></span><span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1074" />&nbsp;</span><span style="color: blue">public</span>&nbsp;<span style="color: blue">static</span>&nbsp;<span style="color: blue">void</span><span style="color: black">&nbsp;main(String[]args)<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.gif" width="11" border="0" v:shapes="_56_121_Open_Image" /><img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image006.gif" width="11" border="0" v:shapes="_56_121_Closed_Image" />&nbsp;</span><span style="color: black">{<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.gif" width="11" border="0" v:shapes="_x0000_i1034" />&nbsp;&nbsp;Student&nbsp;stA&nbsp;=&nbsp;</span><span style="color: blue">new</span><span style="color: black">&nbsp;Student("wanghao",20,"qinghuadaxue");<strong>&nbsp;</strong></span><strong><span style="color: green">//0</span></strong><span style="color: green"><br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.gif" width="11" border="0" v:shapes="_x0000_i1035" /></span><span style="color: black">&nbsp;}<br />
<img height="16" alt="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image008.gif" width="11" border="0" v:shapes="_x0000_i1036" />}</span></span></p>
<p style="background: #eeeedd; margin: 7.5pt 0cm; text-align: left" align="left"><span style="font-size: 11pt; font-family: 宋体">其语句的执行顺序是怎样的呢？</span><span style="font-size: 11pt; font-family: Verdana"><br />
java</span><strong><span style="font-size: 11pt; color: blue; font-family: 宋体">中，在使用</span></strong><strong><span style="font-size: 11pt; color: blue; font-family: Verdana">new</span></strong><strong><span style="font-size: 11pt; color: blue; font-family: 宋体">操作符创建一个类的实例对象的时候，开始分配空间并将成员变量初始化为</span></strong><strong><span style="font-size: 11pt; color: red; font-family: 宋体">默认的</span></strong><strong><span style="font-size: 11pt; color: blue; font-family: 宋体">数值</span></strong><span style="font-size: 11pt; font-family: 宋体">，注意这里并不是指将变量初始化为在变量定义处的初始值，而<strong><span style="color: red">是给整形赋值</span></strong></span><strong><span style="font-size: 11pt; color: red; font-family: Verdana">0</span></strong><strong><span style="font-size: 11pt; color: red; font-family: 宋体">，给字符串赋值</span></strong><strong><span style="font-size: 11pt; color: red; font-family: Verdana">null </span></strong><strong><span style="font-size: 11pt; color: red; font-family: 宋体">这一点于</span></strong><strong><span style="font-size: 11pt; color: red; font-family: Verdana">C++</span></strong><strong><span style="font-size: 11pt; color: red; font-family: 宋体">不同</span></strong><span style="font-size: 11pt; font-family: 宋体">，（</span><span style="font-size: 11pt; font-family: Verdana">student.name = null , student.age = 0 </span><span style="font-size: 11pt; font-family: 宋体">）</span><span style="font-size: 11pt; font-family: Verdana"><br />
</span><strong><span style="font-size: 11pt; color: red; font-family: 宋体">然后</span></strong><span style="font-size: 11pt; font-family: 宋体">在进入类的构造函数。</span></p>
<p style="background: #eeeedd; margin: 7.5pt 0cm; text-align: left" align="left"><span style="font-size: 11pt; font-family: 宋体">在构造函数里面，首先要检查是否有</span><span style="font-size: 11pt; font-family: Verdana">this</span><span style="font-size: 11pt; font-family: 宋体">或者</span><span style="font-size: 11pt; font-family: Verdana">super</span><span style="font-size: 11pt; font-family: 宋体">调用，</span><span style="font-size: 11pt; font-family: Verdana">this</span><span style="font-size: 11pt; font-family: 宋体">调用是完成本类本身的构造函数之间的调用，</span><span style="font-size: 11pt; font-family: Verdana">super</span><span style="font-size: 11pt; font-family: 宋体">调用是完成对父类的调用。<strong><span style="color: blue">二者只能出现一个，并且只能作为构造函数的第一句出现。</span></strong>在调用</span><span style="font-size: 11pt; font-family: Verdana">this</span><span style="font-size: 11pt; font-family: 宋体">和</span><span style="font-size: 11pt; font-family: Verdana">super</span><span style="font-size: 11pt; font-family: 宋体">的时候实现程序的跳转，转而执行被调用的</span><span style="font-size: 11pt; font-family: Verdana">this</span><span style="font-size: 11pt; font-family: 宋体">构造函数或者</span><span style="font-size: 11pt; font-family: Verdana">super</span><span style="font-size: 11pt; font-family: 宋体">构造函数。</span><span style="font-size: 11pt; font-family: Verdana"><br />
</span><span style="font-size: 11pt; font-family: 宋体">在</span><span style="font-size: 11pt; font-family: Verdana">this</span><span style="font-size: 11pt; font-family: 宋体">和</span><span style="font-size: 11pt; font-family: Verdana">super</span><span style="font-size: 11pt; font-family: 宋体">执行完毕，<strong><span style="color: blue">程序转而执行在类定义的时候进行的变量初始化工作</span></strong><span style="color: blue">。</span></span><span style="font-size: 11pt; font-family: Verdana"><br />
</span><span style="font-size: 11pt; font-family: 宋体">这个执行完毕，才是构造函数中剩下的代码的执行。</span><span style="font-size: 11pt; font-family: Verdana"><br />
</span><span style="font-size: 11pt; font-family: 宋体">执行顺序已经用绿色标出。</span><span style="font-family: Georgia"></p>
<p>Order of initialization<br />
Within a class, the order of initialization is determined by the order that the variables are defined within the class. The variable definitions may be scattered throughout and in between method definitions, but the variables are initialized before any methods can be called—even the constructor. For example: Feedback<br />
//: c04:OrderOfInitialization.java<br />
// Demonstrates initialization order.<br />
import com.bruceeckel.simpletest.*;</p>
<p>// When the constructor is called to create a<br />
// Tag object, you'll see a message:<br />
class Tag {<br />
&nbsp; Tag(int marker) {<br />
&nbsp;&nbsp;&nbsp; System.out.println("Tag(" + marker + ")");<br />
&nbsp; }<br />
}</p>
<p>class Card {<br />
&nbsp; Tag t1 = new Tag(1); // Before constructor<br />
&nbsp; Card() {<br />
&nbsp;&nbsp;&nbsp; // Indicate we're in the constructor:<br />
&nbsp;&nbsp;&nbsp; System.out.println("Card()");<br />
&nbsp;&nbsp;&nbsp; t3 = new Tag(33); // Reinitialize t3<br />
&nbsp; }<br />
&nbsp; Tag t2 = new Tag(2); // After constructor<br />
&nbsp; void f() {<br />
&nbsp;&nbsp;&nbsp; System.out.println("f()");<br />
&nbsp; }<br />
&nbsp; Tag t3 = new Tag(3); // At end<br />
}</p>
<p>public class OrderOfInitialization {<br />
&nbsp; static Test monitor = new Test();<br />
&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp; Card t = new Card();<br />
&nbsp;&nbsp;&nbsp; t.f(); // Shows that construction is done<br />
&nbsp;&nbsp;&nbsp; monitor.expect(new String[] {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Tag(1)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Tag(2)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Tag(3)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Card()",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Tag(33)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "f()"<br />
&nbsp;&nbsp;&nbsp; });<br />
&nbsp; }<br />
} ///:~</p>
<p><br />
//: c04:StaticInitialization.java<br />
// Specifying initial values in a class definition.<br />
class Bowl {<br />
&nbsp; Bowl(int marker) {<br />
&nbsp;&nbsp;&nbsp; System.out.println("Bowl(" + marker + ")");<br />
&nbsp; }<br />
&nbsp; void f(int marker) {<br />
&nbsp;&nbsp;&nbsp; System.out.println("f(" + marker + ")");<br />
&nbsp; }<br />
}</p>
<p>class Table {<br />
&nbsp; static Bowl b1 = new Bowl(1);<br />
&nbsp; Table() {<br />
&nbsp;&nbsp;&nbsp; System.out.println("Table()");<br />
&nbsp;&nbsp;&nbsp; b2.f(1);<br />
&nbsp; }<br />
&nbsp; void f2(int marker) {<br />
&nbsp;&nbsp;&nbsp; System.out.println("f2(" + marker + ")");<br />
&nbsp; }<br />
&nbsp; static Bowl b2 = new Bowl(2);<br />
}</p>
<p>class Cupboard {<br />
&nbsp; Bowl b3 = new Bowl(3);<br />
&nbsp; static Bowl b4 = new Bowl(4);<br />
&nbsp; Cupboard() {<br />
&nbsp;&nbsp;&nbsp; System.out.println("Cupboard()");<br />
&nbsp;&nbsp;&nbsp; b4.f(2);<br />
&nbsp; }<br />
&nbsp; void f3(int marker) {<br />
&nbsp;&nbsp;&nbsp; System.out.println("f3(" + marker + ")");<br />
&nbsp; }<br />
&nbsp; static Bowl b5 = new Bowl(5);<br />
}</p>
<p>public class StaticInitialization {<br />
&nbsp; static Test monitor = new Test();<br />
&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp; System.out.println("Creating new Cupboard() in main");<br />
&nbsp;&nbsp;&nbsp; new Cupboard();<br />
&nbsp;&nbsp;&nbsp; System.out.println("Creating new Cupboard() in main");<br />
&nbsp;&nbsp;&nbsp; new Cupboard();<br />
&nbsp;&nbsp;&nbsp; t2.f2(1);<br />
&nbsp;&nbsp;&nbsp; t3.f3(1);<br />
&nbsp;&nbsp;&nbsp; monitor.expect(new String[] {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Bowl(1)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Bowl(2)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Table()",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "f(1)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Bowl(4)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Bowl(5)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Bowl(3)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Cupboard()",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "f(2)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Creating new Cupboard() in main",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Bowl(3)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Cupboard()",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "f(2)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Creating new Cupboard() in main",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Bowl(3)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Cupboard()",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "f(2)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "f2(1)",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "f3(1)"<br />
&nbsp;&nbsp;&nbsp; });<br />
&nbsp; }<br />
&nbsp; static Table t2 = new Table();<br />
&nbsp; static Cupboard t3 = new Cupboard();<br />
} ///:~</p>
<p><br />
继承情况下的初始化<br />
了解一下包括继承在内的初始化的过程将是非常有益的，这样就能有个总<br />
体的了解。看看下面这段代码：<br />
//: c06:Beetle.java<br />
// The full process of initialization.<br />
class Insect {<br />
&nbsp; protected static Test monitor = new Test();<br />
&nbsp; private int i = 9;<br />
&nbsp; protected int j;<br />
&nbsp; Insect() {<br />
&nbsp;&nbsp;&nbsp; System.out.println("i = " + i + ", j = " + j);<br />
&nbsp;&nbsp;&nbsp; j = 39;<br />
&nbsp; }<br />
&nbsp; private static int x1 = print("static Insect.x1 initialized");<br />
&nbsp; static int print(String s) {<br />
&nbsp;&nbsp;&nbsp; System.out.println(s);<br />
&nbsp;&nbsp;&nbsp; return 47;<br />
&nbsp; }<br />
}</p>
<p>public class Beetle extends Insect {<br />
&nbsp; private int k = print("Beetle.k initialized");<br />
&nbsp; public Beetle() {<br />
&nbsp;&nbsp;&nbsp; System.out.println("k = " + k);<br />
&nbsp;&nbsp;&nbsp; System.out.println("j = " + j);<br />
&nbsp; }<br />
&nbsp; private static int x2 = print("static Beetle.x2 initialized");<br />
&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp; System.out.println("Beetle constructor");<br />
&nbsp;&nbsp;&nbsp; Beetle b = new Beetle();<br />
&nbsp;&nbsp;&nbsp; monitor.expect(new String[] {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "static Insect.x1 initialized",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "static Beetle.x2 initialized",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Beetle constructor",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "i = 9, j = 0",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Beetle.k initialized",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "k = 47",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "j = 39"<br />
&nbsp;&nbsp;&nbsp; });<br />
&nbsp; }<br />
} ///:~</p>
<p></span><span style="font-size: 12pt; font-family: 宋体">当你用</span><span style="font-size: 12pt; font-family: TT1D3Eo00">Java </span><span style="font-size: 12pt; font-family: 宋体">运行</span><span style="font-size: 12pt; font-family: TT1D3Eo00">Beetle </span><span style="font-size: 12pt; font-family: 宋体">的时候，第一件事就是访问了</span><span style="font-size: 12pt; font-family: TT1D3Eo00">Beetel.main( )(</span><span style="font-size: 12pt; font-family: 宋体">这是一个</span><span style="font-size: 12pt; font-family: TT1D3Eo00">static </span><span style="font-size: 12pt; font-family: 宋体">方<span style="color: blue">法</span></span><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">)</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">，于是装载器</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">(loader)</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">就会为</span></strong></p>
<p><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">你寻找经编译的</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">Beetle </span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">类的代码</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">(</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">也就是</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">Beetle.class </span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">文件</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">)</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">。在装载的过程中，装载器注意到它有一个基类</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">(</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">也就是</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">extends </span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">所要表示的意思</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">)</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">，于是它再装载基类。不管你创不创建基类对象，这个过程总会发生。</span></strong><span style="font-size: 12pt; font-family: TT1D3Eo00">(</span><span style="font-size: 12pt; font-family: 宋体">试试看，把创建对象的那句注释掉，看看会有什么结果。</span><span style="font-size: 12pt; font-family: TT1D3Eo00">)</span><span style="font-size: 12pt; font-family: 宋体">如果基类还有基类，那么这第二个基类也会被装载，以此类推<span style="color: blue">。<strong>下一步，它会执行&#8220;根基类</strong></span></span><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">(root bas e class)</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">&#8221;</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">(</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">这里就是</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">Insect)</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">的</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">static </span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">初始化，然后是下一个派生类的</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">static </span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">初始化，</span></strong><span style="font-size: 12pt; font-family: 宋体">以此类推。这个顺序非常重要，因为派生类的&#8220;静态初始化</span><span style="font-size: 12pt; font-family: TT1D3Eo00">(</span><span style="font-size: 12pt; font-family: 宋体">即前面讲的</span><span style="font-size: 12pt; font-family: TT1D3Eo00">static </span><span style="font-size: 12pt; font-family: 宋体">初始化</span><span style="font-size: 12pt; font-family: TT1D3Eo00">)</span><span style="font-size: 12pt; font-family: 宋体">&#8221;有可能要依赖基类成员的正确初始化。</span></p>
<p><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">现在所有必要的类都已经装载结束，可以创建对象了。</span></strong><span style="font-size: 12pt; font-family: 宋体">首先，对象里的所有的</span><span style="font-size: 12pt; font-family: TT1D3Eo00">primitive </span><span style="font-size: 12pt; font-family: 宋体">都会被设成它们的缺省值，而</span><span style="font-size: 12pt; font-family: TT1D3Eo00">reference </span><span style="font-size: 12pt; font-family: 宋体">也会被设成</span><span style="font-size: 12pt; font-family: TT1D3Eo00">null</span><span style="font-size: 12pt; font-family: 宋体">——这个过程是<strong><span style="color: blue">一瞬间</span></strong>完成的，对象的内存会被统一地设置成&#8220;两进制的零</span><span style="font-size: 12pt; font-family: TT1D3Eo00">(binary zero)</span><span style="font-size: 12pt; font-family: 宋体">&#8221;。<strong><span style="color: blue">如果有对成员变量赋初值，则对成员变量进行赋值，然后调用基类的构造函数。调用是自动发生的，但是你可以使用</span></strong></span><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">super </span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">来指定调用哪个构造函数</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">(</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">也就</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">Beetle( )</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">构造函数所做的第一件事</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: TT1D3Eo00">)</span></strong><strong><span style="font-size: 12pt; color: blue; font-family: 宋体">。基类的构造过程以及构造顺序，同派生类的相同。基类构造函数运行完毕之后，会按照各个变量的字面顺序进行初始化。最后会执行构造函数的其余部分。</span></strong></p>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/270110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-11 21:16 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>*C++中函数值返回的过程中的问题，是否创建临时变量</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270051.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Mon, 11 May 2009 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270051.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/270051.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270051.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/270051.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/270051.html</trackback:ping><description><![CDATA[<p>Sales_item operator+(const Sales_item&amp; lhs,const Sales_item&amp; rhs) <br />
{ <br />
&nbsp;&nbsp;&nbsp; Sales_item ret(lhs) ; <br />
&nbsp;&nbsp;&nbsp; ret+= rhs ; <br />
&nbsp;&nbsp;&nbsp; return ret ; <br />
} <br />
怎么可以返回一个局部变量呢？？？？？？ <br />
例如 <br />
Sales_item item1,item2,item3 ; <br />
......(item2,item3初始化成员变量) <br />
item1 = item2 + item3 ; </p>
<p><br />
没有问题，它返回的是一个值，而不是引用，所以是正确的。在item1 = item2 + item3 中发生了一次值拷贝(赋值)，也就是将item2+item3返回的局部变量拷贝给了item1之后，局部变量的作用域结束&nbsp;<br />
&nbsp;<br />
<span style="color: red"><strong>可以返回局部变量，但是不能返回局部变量的引用。理解区分值和引用这两个概念是学习C++的一大关键，明白这两个概念之后，你就会理解为什么C++的类里面需要有拷贝构造函数，赋值操作符，析构函数三个元素了以及其它的一些稀里古怪的用法和忠告了 <br />
</strong></span>-- </p>
<p>&nbsp;</p>
<p>Sales_item operator+(const Sales_item&amp; lhs,const Sales_item&amp; rhs)&nbsp; <br />
{&nbsp; <br />
&nbsp;&nbsp;&nbsp; Sales_item ret(lhs) ;&nbsp; <br />
&nbsp;&nbsp;&nbsp; ret+= rhs ;&nbsp; <br />
&nbsp;&nbsp;&nbsp; return ret ;&nbsp; <br />
} <br />
在return ret 时并不是简单的返回这个局部变量，而是返回的是ret的一个副本temp, <br />
temp是通过拷贝构造函数实现的 即 Sales_item temp(ret);也就是说在主函数中用的其实是个temp,而ret早在operator+调用完毕后就释放了<span style="color: red">，而temp这个 对象一直在主函数中贮存（虽然显示是看不到的 ）<strong><span style="color: red"><strong>&nbsp;</strong><strong>&nbsp;????</strong></span></strong></span></p>
<p><br />
嗯嗯，临时对象一直是个有争议的话题。<span style="color: red"><strong>temp只是临时构造的，在赋值完毕之后它就析构了，不是一直在主函数中贮存的。这个临时对象的作用域是什么？？？<br />
</strong></span>在你提的这种情况下，其实编译器是可以优化掉这个副本的，但是可惜C++标准只允许优化&nbsp; &#8220;Sales_item item1=item2+item3&#8221; 这种情况的,也就是在拷贝构造这种情况下，编译器都不再产生副本，而赋值还是不行的。也许在未来的C++标准由可能通过拓展语义来消除临时对象，毕竟临时对象成为影响C++效率的一个主要因素。 <br />
-- </p>
<p>???<br />
<span style="color: red"><strong><span style="color: #0000ff">目前的C++标准不允许在赋值的时候优化掉函数返回的副本，也就是下面这两种情况是不一样的 <br />
&nbsp;<br />
//这是赋值给item1，目前的标准下是会产生副本 temp<br />
Sales_item item1,item2,item3; <br />
item1=item2+item3; <br />
&nbsp;<br />
//这是拷贝构造item1，编译器通常会优化<span style="color: #ff0000">(这个优化区别下面所说的NRV优化)</span>掉副本，也就是不产生副本 temp<br />
Sales_item item2,item3; <br />
Sales_item item1=item2+item3; <br />
</span><br />
看一下代码中的TheFunctionTwo();<br />
</strong></p>
<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"><strong><span style="color: #008080">&nbsp;&nbsp;1</span>&nbsp;<span style="color: #000000">#include</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span></strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #000000">#include</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span></strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;&nbsp;3</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span></strong><strong><span style="color: #000000">&nbsp;std;<br />
</span><span style="color: #008080">&nbsp;&nbsp;5</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;&nbsp;6</span>&nbsp;<span style="color: #0000ff">class</span></strong><strong><span style="color: #000000">&nbsp;SimpleCat<br />
</span><span style="color: #008080">&nbsp;&nbsp;7</span>&nbsp;</strong><strong><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;&nbsp;8</span>&nbsp;<span style="color: #0000ff">public</span></strong><strong><span style="color: #000000">:<br />
</span><span style="color: #008080">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat(</span><span style="color: #0000ff">void</span></strong><strong><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age,</span><span style="color: #0000ff">int</span></strong><strong><span style="color: #000000">&nbsp;weight);<br />
</span><span style="color: #008080">&nbsp;11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat(SimpleCat&nbsp;</span><span style="color: #000000">&amp;</span></strong><strong><span style="color: #000000">rsc);<br />
</span><span style="color: #008080">&nbsp;12</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat&nbsp;</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;SimpleCat&nbsp;</span><span style="color: #000000">&amp;</span></strong><strong><span style="color: #000000">rhs);<br />
</span><span style="color: #008080">&nbsp;13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;GetAge(){</span><span style="color: #0000ff">return</span></strong><strong><span style="color: #000000">&nbsp;itsAge;}<br />
</span><span style="color: #008080">&nbsp;14</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;GetWeight(){</span><span style="color: #0000ff">return</span></strong><strong><span style="color: #000000">&nbsp;itsWeight;}<br />
</span><span style="color: #008080">&nbsp;15</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;SetAge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age){itsAge&nbsp;</span><span style="color: #000000">=</span></strong><strong><span style="color: #000000">&nbsp;age;}<br />
</span><span style="color: #008080">&nbsp;16</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;17</span>&nbsp;<span style="color: #0000ff">private</span></strong><strong><span style="color: #000000">:<br />
</span><span style="color: #008080">&nbsp;18</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span></strong><strong><span style="color: #000000">&nbsp;itsAge;<br />
</span><span style="color: #008080">&nbsp;19</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span></strong><strong><span style="color: #000000">&nbsp;itsWeight;<br />
</span><span style="color: #008080">&nbsp;20</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">int&nbsp;itsAge=5;</span><span style="color: #008000">//</span><span style="color: #008000">1&gt;.\SimpleCat.cpp(14)&nbsp;:&nbsp;error&nbsp;C2864:&nbsp;&#8220;SimpleCat::itsAge&#8221;:&nbsp;只有静态常量整型数据成员才可以在类中初始化</span></strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">&nbsp;21</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;22</span>&nbsp;<span style="color: #0000ff">public</span></strong><strong><span style="color: #000000">:<br />
</span><span style="color: #008080">&nbsp;23</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">SimpleCat(</span><span style="color: #0000ff">void</span></strong><strong><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;24</span>&nbsp;</strong><strong><span style="color: #000000">};<br />
</span><span style="color: #008080">&nbsp;25</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;26</span>&nbsp;<span style="color: #000000">SimpleCat::SimpleCat(</span><span style="color: #0000ff">void</span></strong><strong><span style="color: #000000">)<br />
</span><span style="color: #008080">&nbsp;27</span>&nbsp;</strong><strong><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;28</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">SimpleCat&nbsp;constructor&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #0000ff">this</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">&nbsp;29</span>&nbsp;</strong><strong><span style="color: #000000">}<br />
</span><span style="color: #008080">&nbsp;30</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;31</span>&nbsp;<span style="color: #000000">SimpleCat::SimpleCat(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age,</span><span style="color: #0000ff">int</span></strong><strong><span style="color: #000000">&nbsp;weight)<br />
</span><span style="color: #008080">&nbsp;32</span>&nbsp;</strong><strong><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;33</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">SimpleCat&nbsp;constructor&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #0000ff">this</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">&nbsp;34</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;itsAge&nbsp;</span><span style="color: #000000">=</span></strong><strong><span style="color: #000000">&nbsp;age;<br />
</span><span style="color: #008080">&nbsp;35</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;itsWeight&nbsp;</span><span style="color: #000000">=</span></strong><strong><span style="color: #000000">&nbsp;weight;<br />
</span><span style="color: #008080">&nbsp;36</span>&nbsp;</strong><strong><span style="color: #000000">}<br />
</span><span style="color: #008080">&nbsp;37</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;38</span>&nbsp;<span style="color: #000000">SimpleCat::SimpleCat(SimpleCat&nbsp;</span><span style="color: #000000">&amp;</span></strong><strong><span style="color: #000000">rhs)<br />
</span><span style="color: #008080">&nbsp;39</span>&nbsp;</strong><strong><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;40</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">SimpleCat&nbsp;copy&nbsp;constructor</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #0000ff">this</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;从&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;&amp;</span><span style="color: #000000">rhs</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">拷贝</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">&nbsp;41</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;itsAge&nbsp;</span><span style="color: #000000">=</span></strong><strong><span style="color: #000000">&nbsp;rhs.itsAge;<br />
</span><span style="color: #008080">&nbsp;42</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;itsWeight&nbsp;</span><span style="color: #000000">=</span></strong><strong><span style="color: #000000">&nbsp;rhs.itsWeight;<br />
</span><span style="color: #008080">&nbsp;43</span>&nbsp;</strong><strong><span style="color: #000000">}<br />
</span><span style="color: #008080">&nbsp;44</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;45</span>&nbsp;<span style="color: #000000">SimpleCat&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">SimpleCat::</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;SimpleCat&nbsp;</span><span style="color: #000000">&amp;</span></strong><strong><span style="color: #000000">rhs)<br />
</span><span style="color: #008080">&nbsp;46</span>&nbsp;</strong><strong><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;47</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">SimpleCat重载赋值运算符</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #0000ff">this</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;从&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;&amp;</span><span style="color: #000000">rhs</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">赋值</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">&nbsp;48</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;itsAge&nbsp;</span><span style="color: #000000">=</span></strong><strong><span style="color: #000000">&nbsp;rhs.itsAge;<br />
</span><span style="color: #008080">&nbsp;49</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;itsWeight&nbsp;</span><span style="color: #000000">=</span></strong><strong><span style="color: #000000">&nbsp;rhs.itsWeight;<br />
</span><span style="color: #008080">&nbsp;50</span>&nbsp;<span style="color: #000000">&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></strong><strong><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;51</span>&nbsp;</strong><strong><span style="color: #000000">}<br />
</span><span style="color: #008080">&nbsp;52</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;53</span>&nbsp;<span style="color: #000000">SimpleCat::</span><span style="color: #000000">~</span><span style="color: #000000">SimpleCat(</span><span style="color: #0000ff">void</span></strong><strong><span style="color: #000000">)<br />
</span><span style="color: #008080">&nbsp;54</span>&nbsp;</strong><strong><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;55</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">SimpleCat&nbsp;destructor</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #0000ff">this</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">&nbsp;56</span>&nbsp;</strong><strong><span style="color: #000000">}<br />
</span><span style="color: #008080">&nbsp;57</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;58</span>&nbsp;<span style="color: #000000">SimpleCat&nbsp;</span><span style="color: #000000">&amp;</span></strong><strong><span style="color: #000000">TheFunction();<br />
</span><span style="color: #008080">&nbsp;59</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;60</span>&nbsp;</strong><strong><span style="color: #000000">SimpleCat&nbsp;TheFunctionTwo();<br />
</span><span style="color: #008080">&nbsp;61</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;62</span>&nbsp;<span style="color: #000000">SimpleCat&nbsp;</span><span style="color: #000000">&amp;</span></strong><strong><span style="color: #000000">TheFunctionThree();<br />
</span><span style="color: #008080">&nbsp;63</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;64</span>&nbsp;<span style="color: #0000ff">void</span></strong><strong><span style="color: #000000">&nbsp;TheFunctionFour(SimpleCat&nbsp;simpleCat);<br />
</span><span style="color: #008080">&nbsp;65</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;66</span>&nbsp;<span style="color: #0000ff">int</span></strong><strong><span style="color: #000000">&nbsp;main()<br />
</span><span style="color: #008080">&nbsp;67</span>&nbsp;</strong><strong><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;68</span>&nbsp;</strong><strong><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat&nbsp;myCat;<br />
</span><span style="color: #008080">&nbsp;69</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">myCat.GetAge()</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;</span><span style="color: #008000">//</span></strong><strong><span style="color: #008000">这个值区别于java不是赋初值为0的,而是一个随机的值<br />
</span><span style="color: #008080">&nbsp;70</span>&nbsp;<span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;myCat.itsAge&lt;&lt;endl;</span></strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">&nbsp;71</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;72</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">------------------------</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">&nbsp;73</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">rCat&nbsp;</span><span style="color: #000000">=</span></strong><strong><span style="color: #000000">&nbsp;TheFunction();<br />
</span><span style="color: #008080">&nbsp;74</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age&nbsp;</span><span style="color: #000000">=</span></strong><strong><span style="color: #000000">&nbsp;rCat.GetAge();<br />
</span><span style="color: #008080">&nbsp;75</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">rCat&nbsp;is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">age</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">yeas&nbsp;old!</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">&nbsp;76</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">&amp;rCat:&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;&amp;</span><span style="color: #000000">rCat</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">&nbsp;77</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pCat&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span></strong><strong><span style="color: #000000">rCat;<br />
</span><span style="color: #008080">&nbsp;78</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">delete&nbsp;rCat;</span><span style="color: #008000">//</span><span style="color: #008000">不能对引用使用delete</span></strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">&nbsp;79</span>&nbsp;</strong><strong><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;pCat;<br />
</span><span style="color: #008080">&nbsp;80</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></strong><strong><span style="color: #008000">delete好像没有释放内存，怎么获取的还是原来的值<br />
</span><span style="color: #008080">&nbsp;81</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">可能在这个内存区域存放的还是原来的?先new&nbsp;string后再调用也没变，与编译器有关还是什么??</span></strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">&nbsp;82</span>&nbsp;<span style="color: #000000">&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&nbsp;</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">10</span><span style="color: #000000">;i</span><span style="color: #000000">++</span></strong><strong><span style="color: #000000">)<br />
</span><span style="color: #008080">&nbsp;83</span>&nbsp;</strong><strong><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080">&nbsp;84</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">想通过创建string对象来填充之前的内存区间，好像没用</span></strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">&nbsp;85</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">abcdefghijklmn</span><span style="color: #000000">"</span></strong><strong><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;86</span>&nbsp;</strong><strong><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">&nbsp;87</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;88</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">这时问题来了,rCat.getAge()为123了</span></strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">&nbsp;89</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pSecond&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleCat(</span><span style="color: #000000">123</span><span style="color: #000000">,</span><span style="color: #000000">444</span></strong><strong><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;90</span>&nbsp;</strong><strong><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;91</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">delete&nbsp;pCat后再使用rCat引用会发生什么问题???</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">&nbsp;92</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">delete&nbsp;pCat后&nbsp;&amp;rCat</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;&amp;</span><span style="color: #000000">rCat</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">&nbsp;93</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">delete&nbsp;pCat后&nbsp;rCat.age</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">rCat.GetAge()</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">&nbsp;94</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">&nbsp;95</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">--------------------------</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">&nbsp;96</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat&nbsp;myCat2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;TheFunction();</span><span style="color: #008000">//</span></strong><strong><span style="color: #008000">这个会发生内存泄漏，在函数中申请的内存会得不到释放<br />
</span><span style="color: #008080">&nbsp;97</span>&nbsp;<span style="color: #008000">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">myCat2是通过默认的拷贝函数来进行初始化的</span></strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">&nbsp;98</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">myCat2的地址是&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;&amp;</span><span style="color: #000000">myCat2</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">&nbsp;99</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">---------------------------</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">100</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">101</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></strong><strong><span style="color: #008000">直接的调用默认拷贝构造函数的<br />
</span><span style="color: #008080">102</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></strong><strong><span style="color: #008000">cout&lt;&lt;"直接的调用默认拷贝构造函数的,这个语句一共创建了多少个对象"&lt;&lt;endl;<br />
</span><span style="color: #008080">103</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">SimpleCat&nbsp;myCat3&nbsp;=&nbsp;TheFunctionTwo();</span><span style="color: #008000">//</span></strong><strong><span style="color: #008000">这个尽然没调用拷贝构造函数?????<br />
</span><span style="color: #008080">104</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></strong><strong><span style="color: #008000">cout&lt;&lt;"myCat3的地址是&nbsp;"&lt;&lt;&amp;myCat3&lt;&lt;endl;<br />
</span><span style="color: #008080">105</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></strong><strong><span style="color: #008000">cout&lt;&lt;"myCat3.GetAge()&nbsp;&nbsp;"&lt;&lt;myCat3.GetAge()&lt;&lt;endl;<br />
</span><span style="color: #008080">106</span>&nbsp;</strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">107</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></strong><strong><span style="color: #008000">调用默认的赋值运算符的<br />
</span><span style="color: #008080">108</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></strong><strong><span style="color: #008000">cout&lt;&lt;"调用默认的赋值运算符的,这个语句一共创建了多少个对象"&lt;&lt;endl;<br />
</span><span style="color: #008080">109</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></strong><strong><span style="color: #008000">SimpleCat&nbsp;myCat4;<br />
</span><span style="color: #008080">110</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></strong><strong><span style="color: #008000">myCat4&nbsp;=&nbsp;TheFunctionTwo();<br />
</span><span style="color: #008080">111</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></strong><strong><span style="color: #008000">cout&lt;&lt;"myCat4.GetAge()&nbsp;&nbsp;"&lt;&lt;myCat4.GetAge()&lt;&lt;endl;<br />
</span><span style="color: #008080">112</span>&nbsp;</strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">113</span>&nbsp;</strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">114</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></strong><strong><span style="color: #008000">这种调用的方式<br />
</span><span style="color: #008080">115</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></strong><strong><span style="color: #008000">cout&lt;&lt;"TheFunctionTwo()返回的临时对象赋给一个引用"&lt;&lt;endl;<br />
</span><span style="color: #008080">116</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></strong><strong><span style="color: #008000">SimpleCat&nbsp;&amp;rmyCat&nbsp;=&nbsp;TheFunctionTwo();<br />
</span><span style="color: #008080">117</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></strong><strong><span style="color: #008000">cout&lt;&lt;"打印一下返回的临时对象的地址，临时对象赋给引用之后就不会立即析构了---"&lt;&lt;&amp;rmyCat&lt;&lt;endl;<br />
</span><span style="color: #008080">118</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">cout&lt;&lt;"rmCat.GetAge()&nbsp;"&lt;&lt;rmyCat.GetAge()&lt;&lt;endl;</span></strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">119</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">120</span>&nbsp;</strong><strong><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat&nbsp;myCat5;<br />
</span><span style="color: #008080">121</span>&nbsp;</strong><strong><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;TheFunctionFour(myCat5);<br />
</span><span style="color: #008080">122</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">123</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span></strong><strong><span style="color: #000000">;<br />
</span><span style="color: #008080">124</span>&nbsp;</strong><strong><span style="color: #000000">}<br />
</span><span style="color: #008080">125</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">126</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">127</span>&nbsp;<span style="color: #008000">//</span></strong><strong><span style="color: #008000">这个函数在返回时，是否会创建一个临时引用变量???<br />
</span><span style="color: #008080">128</span>&nbsp;<span style="color: #008000">//</span></strong><strong><span style="color: #008000">TheFunctionTwo(SimpleCat&nbsp;&amp;simpleCat)这个函数在传递参数时是否会创建一个临时的引用变量<br />
</span><span style="color: #008080">129</span>&nbsp;<span style="color: #008000">//</span><span style="color: #008000">临时的引用变量的作用域范围是什么</span></strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">130</span>&nbsp;<span style="color: #000000">SimpleCat&nbsp;</span><span style="color: #000000">&amp;</span></strong><strong><span style="color: #000000">TheFunction()<br />
</span><span style="color: #008080">131</span>&nbsp;</strong><strong><span style="color: #000000">{<br />
</span><span style="color: #008080">132</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pFrisky&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleCat(</span><span style="color: #000000">5</span><span style="color: #000000">,</span><span style="color: #000000">9</span></strong><strong><span style="color: #000000">);<br />
</span><span style="color: #008080">133</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">pFrisky:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">pFrisky</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">134</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span></strong><strong><span style="color: #000000">pFrisky;<br />
</span><span style="color: #008080">135</span>&nbsp;</strong><strong><span style="color: #000000">}<br />
</span><span style="color: #008080">136</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">137</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">138</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">139</span>&nbsp;<span style="color: #008000">//</span><span style="color: #008000">我要看对象被创建了几次,是否创建临时对象</span></strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">140</span>&nbsp;</strong><strong><span style="color: #000000">SimpleCat&nbsp;TheFunctionTwo()<br />
</span><span style="color: #008080">141</span>&nbsp;</strong><strong><span style="color: #000000">{<br />
</span><span style="color: #008080">142</span>&nbsp;</strong><strong><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat&nbsp;tempCat;<br />
</span><span style="color: #008080">143</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">in&nbsp;TheFunctionTwo&nbsp;tempCat指针&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;&amp;</span><span style="color: #000000">tempCat</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">144</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;tempCat.SetAge(</span><span style="color: #000000">9999</span></strong><strong><span style="color: #000000">);<br />
</span><span style="color: #008080">145</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回时是否还创建一个临时对象</span></strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">146</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span></strong><strong><span style="color: #000000">&nbsp;tempCat;<br />
</span><span style="color: #008080">147</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">148</span>&nbsp;</strong><strong><span style="color: #000000">}<br />
</span><span style="color: #008080">149</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">150</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">151</span>&nbsp;<span style="color: #008000">//</span><span style="color: #008000">这种方式肯定是错的，返回了局部变量的引用</span></strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">152</span>&nbsp;<span style="color: #000000">SimpleCat&nbsp;</span><span style="color: #000000">&amp;</span></strong><strong><span style="color: #000000">TheFunctionThree()<br />
</span><span style="color: #008080">153</span>&nbsp;</strong><strong><span style="color: #000000">{<br />
</span><span style="color: #008080">154</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SimpleCat&nbsp;tempCat;</span><span style="color: #008000">//</span><span style="color: #008000">局部变量</span></strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">155</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">in&nbsp;TheFunctionThree&nbsp;tempCat指针&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;&amp;</span><span style="color: #000000">tempCat</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">156</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;tempCat.SetAge(</span><span style="color: #000000">9999</span></strong><strong><span style="color: #000000">);<br />
</span><span style="color: #008080">157</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回时是否还创建一个临时对象,已引用的形式</span></strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">158</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span></strong><strong><span style="color: #000000">&nbsp;tempCat;<br />
</span><span style="color: #008080">159</span>&nbsp;</strong><strong><span style="color: #000000">}<br />
</span><span style="color: #008080">160</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">161</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">162</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">163</span>&nbsp;<span style="color: #008000">//</span><span style="color: #008000">我要看再实参对形参进行拷贝构造时,是否会打印出调用的拷贝函数信息</span></strong><span style="color: #008000"><br />
</span><strong><span style="color: #008080">164</span>&nbsp;<span style="color: #0000ff">void</span></strong><strong><span style="color: #000000">&nbsp;TheFunctionFour(SimpleCat&nbsp;simpleCat)<br />
</span><span style="color: #008080">165</span>&nbsp;</strong><strong><span style="color: #000000">{<br />
</span><span style="color: #008080">166</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">形式参数simpleCat的地址&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;&amp;</span><span style="color: #000000">simpleCat</span><span style="color: #000000">&lt;&lt;</span></strong><strong><span style="color: #000000">endl;<br />
</span><span style="color: #008080">167</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">168</span>&nbsp;</strong><strong><span style="color: #000000">}<br />
</span><span style="color: #008080">169</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">170</span>&nbsp;</strong><span style="color: #000000"><br />
</span><strong><span style="color: #008080">171</span>&nbsp;</strong></div>
<br />
<span style="color: #000000">------------------------------------------------------------------------------------------------------------------------------<br />
先说说第一块吧， <br />
这个貌似应该调用拷贝构造的地方没有调用拷贝构造，应该是编译器做的优化，可以参考《深入探索C++对象模型》P66页。 <br />
按照书中的说法，很可能只创建了1个对象 <br />
&nbsp;<br />
X bar() <br />
{ <br />
&nbsp;&nbsp;&nbsp; X xx; <br />
&nbsp;&nbsp;&nbsp; return xx; <br />
} <br />
可能会被编译器优化成 <br />
void bar(X &amp; _result) <br />
{ <br />
&nbsp;&nbsp;&nbsp; _result.X::X(); <br />
&nbsp;&nbsp;&nbsp; return; <br />
} <br />
&nbsp;<br />
所以调用X a = bar(),其实被转换成 bar(X&amp; a); <br />
所以一个本该调用拷贝构造的地方却很可能调仅用了构造函数来完成工作。 <br />
这个问题我也没有搞明白，我没有试过lz的代码是不是会这样，如果真这样的话，我觉得编译器就管的太多了，如果拷贝构造中有一些特殊的功能呢(就像楼主有个输出语句)，岂不是无声无息中被抹杀了。这个功能被称为NRV，好像一直没有人对这个问题给出非常明确的回答 <br />
------------------------------------------------------------------------------------------------------------------------------<br />
thx，在vs2005中代码优化开启时，第一块确实只会调一个构造函数 <br />
把代码优化禁用后，就会调用拷贝构造函数了 <br />
确实是个NRV的问题 <br />
http://blog.vckbase.com/bruceteen/archive/2005/12/30/16652.html <br />
------------------------------------------------------------------------------------------------------------------------------<br />
<br />
<span style="color: #ff0000">正如4楼的所说~~~ <br />
到底创建多少临时对象，要视编译器而定，看编译器是否采用NVR... <br />
(其实一般情况下，NVR都是未采用的~),因此对后三个注释代码做 <br />
如下分析：写出编译后的伪代码（仅供参考) <br />
编译器更改后的函数原型void TheFunctionTwo(SimpleCat&amp;) <br />
注释1： <br />
&nbsp;&nbsp;&nbsp; SimpleCat myCat3; <br />
&nbsp;&nbsp;&nbsp; TheFunctionTwo(myCat3) <br />
&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SimpleCat tempCat;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; templCat.SimpleCat::SimpleCat(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"in TheFunctionTwo tempCat指针 "&lt;&lt;&amp;tempCat&lt;&lt;endl;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tempCat.SetAge(9999); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myCat3.SimpleCat::SimpleCat(tempCat); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tempCat.SimpleCat::~SimpleCat(); <br />
&nbsp;&nbsp; } <br />
注释2： <br />
&nbsp;&nbsp;&nbsp; SimpleCat myCat4; <br />
&nbsp;&nbsp;&nbsp; myCat4.SimpleCat::Simple(); <br />
&nbsp;&nbsp;&nbsp; SimpleCat temp; <br />
&nbsp;&nbsp;&nbsp; TheFunctionTwo(temp) <br />
&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp; SimpleCat tempCat;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; templCat.SimpleCat::SimpleCat(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"in TheFunctionTwo tempCat指针 "&lt;&lt;&amp;tempCat&lt;&lt;endl;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tempCat.SetAge(9999); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp.SimpleCat::SimpleCat(tempCat); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tempCat.SimpleCat::~SimpleCat(); <br />
&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; myCat4.operator=(temp); <br />
&nbsp;&nbsp; temp.SimpleCat::~SimpleCat(); <br />
注释3：&nbsp; <br />
&nbsp;&nbsp;&nbsp; //SimpleCat &amp;rmyCat = TheFunctionTwo();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; SimpleCat temp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; SimpleCat &amp;rmyCat=temp; <br />
&nbsp;&nbsp;&nbsp; TheFunctionTwo(temp) <br />
&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SimpleCat tempCat;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; templCat.SimpleCat::SimpleCat(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"in TheFunctionTwo tempCat指针 "&lt;&lt;&amp;tempCat&lt;&lt;endl;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tempCat.SetAge(9999); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp.SimpleCat::SimpleCat(tempCat); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tempCat.SimpleCat::~SimpleCat(); <br />
&nbsp;&nbsp; } <br />
这样就知道到底需要多少临时对象了~~~~ </span><br />
</span></span>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/270051.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-11 15:22 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270051.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从Java到C++ — 对比Java与C++编程的不同</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270049.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Mon, 11 May 2009 06:58:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270049.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/270049.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270049.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/270049.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/270049.html</trackback:ping><description><![CDATA[&nbsp;
<h2><a title="Permanent Link to 从Java到C++ — 对比Java与C++编程的不同" href="http://www.prglab.com/blog/p/48">从Java到C++ — 对比Java与C++编程的不同</a></h2>
<p>14th August 2007, 11:40 pm </p>
<p>原作：<a href="http://www.horstmann.com/" target="_blank">Cay Horstmann</a> <a href="http://www.horstmann.com/ccj2/ccjapp3.html" target="_blank">英文原文</a></p>
<p>翻译：Aqua&nbsp; <a title="全文链接" href="http://prglab.com/blog/p/48">prglab.com</a></p>
<p>注：很多程序员包括本人在内都是先学会的Java，然后才学的C++，其实C++与Java有很多相似和互通之处，有相当的Java知识可以对应转化到C++概念，从而帮助我们快速上手。这篇文章介绍的内容就对从Java向C++转变很有帮助，所以翻译推荐给有同样需要的朋友。翻译中加入了本人的理解，不完全是全文照搬。有不明或异议，请参考原文，或留言讨论。还是那句话，推荐多读原版资料。</p>
<p>学习怎样从一种编程语言转移到另一种编程语言是今日的程序员必须面对的现实，还好，C++和Java有很多共同的特点，所以从Java转到C++就容易许多。C++比Java复杂很多，本文并没打算涵盖所有C++的功能。但是如果你能够熟练掌握本文中的所有知识点，也足够有效的使用C++了。</p>
<p>这里我们只讲Java与C++的不同之处。像流程控制(if, while, for)这些在C++与Java中完全一样的内容这里就不讲了。</p>
<p>本文是基于ANSI C++标准的，一些老的C++ 编译器可能不支持这里讲到的一些重要功能。要使用这些编译器，你需要更多学习C++中从C继承来的部分。那些都超出了本文的范畴，也就不介绍了。</p>
<h2>1. 数据类型和变量</h2>
<p>C++ 中的变量类型与Java很相似。像Java一样，C++ 有<tt><span style="font-size: 12pt; line-height: 150%">int</span></tt>和 <tt><span style="font-size: 12pt; line-height: 150%">double</span></tt>类型<strong><span style="color: red">。但是这些数字类型的取值范围是依赖于机器的。</span></strong>比如在16位系统上，例如运行DOS 或Windows 3.x的PC机上，<tt><span style="font-size: 12pt; line-height: 150%">int</span></tt>是双字节(2-byte)的，取值范围比Java的4-byte的<tt><span style="font-size: 12pt; line-height: 150%">int</span></tt>要小很多。在这些机器上，如果 int 不够用的话，你需要使用长整型long。</p>
<p>C++ 有 <tt><span style="font-size: 12pt; line-height: 150%">short</span></tt>和 <tt><span style="font-size: 12pt; line-height: 150%">unsigned</span></tt>类型来更有效的存储数字。（我认为所谓有效是指更高的空间利用率。） 最好是尽量避免使用这些类型除非是空间利用的有效性对你的系统真的非常重要。</p>
<p><strong><span style="color: red">在C++中布尔型用 </span></strong><tt><strong><span style="font-size: 12pt; color: red; line-height: 150%">bool</span></strong></tt><strong><span style="color: red">表示，而不像在Java中用boolean。</span></strong></p>
<p>C++ 中字符串类型用 <tt><span style="font-size: 12pt; line-height: 150%">string</span></tt>表示。它与Java中的 <tt><span style="font-size: 12pt; line-height: 150%">String</span></tt>类型非常相似，但是，还是要逐一以下几点不同之处：</p>
<p>1. C++ 字符串存储ASCII 码字符，而不是标准码Unicode 字符</p>
<p>2. C++ 字符串是可以被修改的，而Java字符串的内容是不可修改的(immutable)。</p>
<p>3. 取子字符串的操作在 C++ 中叫做 <tt><span style="font-size: 12pt; line-height: 150%">substr</span></tt>，这个命令<tt><span style="font-size: 12pt; line-height: 150%">s.substr(i, n)</span></tt>从字符串s中取得从位置 i 开始长度为n的子字符串。</p>
<p>4. <strong><span style="color: red">在C++中，你只能够将字符串与其它字符串对象相串联(concatenate)，而不能够与任意的对象相串联。</span></strong></p>
<p>5.<strong><span style="color: red"> C++</strong></span><strong><span style="color: red">中可以直接使用关系操作符 </span></strong><tt><strong><span style="font-size: 12pt; color: red; line-height: 150%">==</span></strong></tt><tt><strong><span style="font-size: 12pt; color: red; line-height: 150%">、 !=、 &lt;、 &lt;=、 &gt;、 &gt;= </span></strong></tt><strong><span style="color: red">来进行字符串比较，</span></strong>其中后面四个操作符是按字母顺序进行比较的。这比Java中使用函数equals和compareTo来比较要方便很多。</p>
<h2>2. 变量和常量</h2>
<p>在C++中，本地变量的定义看起来与Java中相同，例如：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">int n = 5;</span></tt></p>
<p><strong><span style="color: red">实际上这正是C++和Java的一个重要不同之处。C++编译器不对本地变量进行初始化检验，所以在C++中很容易忘记初始化一个变量，这种情况下，变量的值该变量所占内存区域中刚好当前存在随机值。这显然是很容易产生程序出错的地方。</span></strong></p>
<p>与Java一样， C++中类可以有数据域和静态变量。不同的是，C++中变量可以在函数甚至是类的外面定义，这些所谓的<strong><span style="color: red">全局变量</span></strong>可以在程序的任何函数中被访问，因而不易被很好的管理。<strong><span style="color: red">所C++中应该尽量避免使用全局变量。</span></strong></p>
<p>在C++中，常量可以在任何地方被定义（记得在Java中，常量必须是类的静态数据static data)。<strong><span style="color: red"> C++ </span><span style="color: red">使用关键字 </span></strong><tt><strong><span style="font-size: 12pt; color: red; line-height: 150%">const</span></strong></tt><strong><span style="color: red">来定义常量，而Java中是 </span></strong><tt><strong><span style="font-size: 12pt; color: red; line-height: 150%">final</span></strong></tt><strong><span style="color: red">。例如：</span></strong></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">const int DAYS_PER_YEAR = 365;</span></tt></p>
<h2>3. 类</h2>
<p>C++ 中对类的定义与Java有些不同，这里是一个例子：一个C++ 版本的 <tt><span style="font-size: 12pt; line-height: 150%">Point</span></tt>类:</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">class Point /* C++ */</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">{</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">public:</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">Point();</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">Point(double xval, double yval);</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">void move(double dx, double dy);</span></tt></p>
<p><tt><span style="font-size: 12pt; color: blue; line-height: 150%">double getX() <strong>const;</strong></span></tt></p>
<p><tt><span style="font-size: 12pt; color: blue; line-height: 150%">double getY() <strong>const;</strong></span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">private:</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">double x;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">double y;</span></tt></p>
<p><tt><strong><span style="font-size: 14pt; color: red; line-height: 150%">};</span></strong></tt></p>
<p>这里几点重要的不同是：</p>
<p>1. C++的类定义中分为公共和私有部分，分别以关键字 <tt><span style="font-size: 12pt; line-height: 150%">public</span></tt>和 <tt><span style="font-size: 12pt; line-height: 150%">private</span></tt>开始。而在Java中，每一个元素都必须标明 <tt><span style="font-size: 12pt; line-height: 150%">public</span></tt>或 <tt><span style="font-size: 12pt; line-height: 150%">private</span></tt>。</p>
<p>2.<strong><span style="color: red"> C++</strong></span><strong><span style="color: red">中类的定义只包含函数的声明，真正的实现另外单独列出。</span></strong></p>
<p><strong><span style="color: blue">3. </span><span style="color: blue">访问函数(accessor methods)标有关键字 </span></strong><tt><strong><span style="font-size: 12pt; color: blue; line-height: 150%">const</span></strong></tt><strong><span style="color: blue">，表明这个函数不会改变本对象的元素值。</span></strong></p>
<p><strong><span style="color: red">4. </span><span style="color: red">类定义的结尾处有分号</span></strong></p>
<p>类中函数的实现跟在类的定义之后。因为函数是在类外面定义的，所以每一个函数的名字前面要加类名称作为前缀，并使用<strong><span style="color: red">操作符双冒号::来分割类的名称和函数的名称</span></strong>。不改变隐含参数值（即当前对象的值）的访问函数用 <tt><span style="font-size: 12pt; line-height: 150%">const</span></tt>标明。如下所示是上面类定义中的函数的实现：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">Point::Point() { x = 0; y = 0; }</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">void Point::move(double dx, double dy) </span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">{</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">x = x + dx;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">y = y + dy;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">}</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">double Point::getX() const</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">{ </span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">return x;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">}</span></tt></p>
<h2>4. 对象</h2>
<p><strong><span style="font-size: 14pt; color: red; line-height: 150%">Java </span></strong><strong><span style="font-size: 14pt; color: red; line-height: 150%">与 C++ 最主要的不同在于对象变量的使用。</span></strong></p>
<p><strong><span style="font-size: 10.5pt; color: blue; line-height: 150%">在 C++中，对象变量存储的是真正的对象的值，而不是对象引用(<a title="关于reference的文章" href="http://www.prglab.com/blog/p/28">reference</a>)。注意在C++中构造一个对象的时候是不使用关键字new的，只需要在变量的名字后面直接赋予构造函数的参数就可以了，例如：</span></strong></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">Point p(1, 2); /* </span></tt><tt><span style="font-size: 12pt; line-height: 150%">构造对象 p */</span></tt></p>
<p>如果不跟参数赋值，则使用默认构造函数，例如：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">Time now; /* </span></tt><tt><span style="font-size: 12pt; line-height: 150%">默认使用构造函数 Time::Time() */</span></tt></p>
<p><strong><span style="font-size: 10.5pt; color: blue; line-height: 150%">这一点与Java很不同。在Java中，这个命令仅仅生成一个没有初始化的对象reference，要创建对象还得使用new在堆中创建一个实际的对象.&nbsp;&nbsp; </span></strong></p>
<p><strong><span style="font-size: 10.5pt; color: blue; line-height: 150%">而在C++中，它生成一个实际的对象。</span></strong></p>
<p><strong><span style="font-size: 10.5pt; color: blue; line-height: 150%">当一个对象被赋给另一个对象变量的时候，实际的值将被拷贝。而在Java中，拷贝一个对象变量只不过是建立了另外一个指向对象的reference。拷贝一个C++的对象就像在Java中调用clone这个函数一样，而修改拷贝的值不会改变原对象的值。</span></strong>例如：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">Point q = p; /* </span></tt><tt><span style="font-size: 12pt; line-height: 150%">拷贝p到q ,q是另外一个新的对象，有自己的内存空间*/</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">q.move(1, 1); /* </span></tt><tt><span style="font-size: 12pt; line-height: 150%">移动q而p不动，即q的值变了，而p的不变*/</span></tt></p>
<p>多数情况下，C++中这种对象直接对值操作的特性使用起来很方便，但是也有些时候不尽如人意：</p>
<p><strong><span style="font-size: 14pt; color: blue; line-height: 150%">C++</span></strong><strong><span style="font-size: 14pt; color: blue; line-height: 150%">中对象的指针非常类似于Java中的引用</span></strong></p>
<p><strong><span style="font-size: 10.5pt; color: blue; line-height: 150%">1. </span></strong><strong><span style="font-size: 10.5pt; color: blue; line-height: 150%">当需要一个函数中修改一个对象的值，必须记住要使用按引用调用call by reference (参见下面函数部分)，或者将参数定义为指针类型,在函数中通过指针来操作其</span></strong><strong><span style="font-size: 10.5pt; color: red; line-height: 150%">实际指向的对象</span></strong></p>
<p><strong><span style="font-size: 10.5pt; color: blue; line-height: 150%">2. </span></strong><strong><span style="font-size: 10.5pt; color: blue; line-height: 150%">两个对象变量不能指向同一个对象实体。如果你要在C++中实现这种效果，必须使用指针pointer（参见下面指针部分）</span></strong></p>
<p><strong><span style="font-size: 10.5pt; color: blue; line-height: 150%">3. </span></strong><strong><span style="font-size: 10.5pt; color: blue; line-height: 150%">一个对象变量只能存储一种特定的类型的值，如果你想要使用一个变量来存储不同子类的对象的值（多态ploymorphism)，则需要使用指针。</span></strong></p>
<p><strong><span style="font-size: 10.5pt; color: blue; line-height: 150%">4. </span></strong><strong><span style="font-size: 10.5pt; color: blue; line-height: 150%">如果你想在C++中使用一个变量来或者指向null或者指向一个实际的对象，则需要使用指针</span></strong></p>
<h2>5. 函数</h2>
<p>在Java中，每一个函数必须或者是对象函数(instance method)，或者是静态函数(static function)或称类函数。C++同样支持对象函数和静态函数（类函数），但同时C++也允许定义不属于任何类的函数，这些函数叫做<strong><span style="color: blue">全局函数<em><span style="font-family: 宋体">（global functions）</span></em>。</span></strong></p>
<p>特别的是，每一个C++ 程序都从一个叫做 <tt><strong><span style="font-size: 12pt; color: blue; line-height: 150%">main</span></strong></tt><strong><span style="color: blue">的全局函数</span></strong>开始执行：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">int main()</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">{ . . .</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">}</span></tt></p>
<p>还有另外一个格式的main函数可以用来捕捉命令行参数，类似于Java的main函数，但是它要求关于C格式的数组和字符串的知识，这里就不介绍了。</p>
<p>按照习惯，通常如果程序执行成功， <tt><span style="font-size: 12pt; line-height: 150%">main</span></tt>函数返回0，否则返回非零整数。</p>
<p><strong><span style="font-size: 10.5pt; color: red; line-height: 150%">同Java一样，函数参数是通过值传递的(passed by value)。在Java中，函数无论如何都是可以修改对象(类对象)的值的（</span></strong><strong><span style="font-size: 10.5pt; color: blue; line-height: 150%">因为java中传递的是java中的引用,相当与C++中的指针。Java函数返回时也是返回的引用,将此引用</span></strong><strong><span style="font-size: 10.5pt; color: red; line-height: 150%">拷贝</span></strong><strong><span style="font-size: 10.5pt; color: blue; line-height: 150%">到外面的某个引用变量中</span></strong><strong><span style="font-size: 10.5pt; color: red; line-height: 150%">）。然而在C++中，</span></strong><strong><span style="font-size: 10.5pt; color: blue; line-height: 150%">因为对象直接存储的是实际的值</span></strong><strong><span style="font-size: 10.5pt; color: red; line-height: 150%">，</span></strong><strong><span style="font-size: 10.5pt; color: blue; line-height: 150%">而不是指向值的reference，</span></strong><strong><span style="font-size: 10.5pt; color: red; line-height: 150%">也就是说传入函数的是一个实际值的拷贝，因此也就无法修改原来对象的值。(C++中函数返回时也是要拷贝到外面的变量中的,是指针就拷贝指针，是对象就进行对象的拷贝)</span></strong></p>
<p>所以，C++ 有两种参数传递机制，同Java一样的按值调用(<em><span style="font-family: 宋体">call by value) </em></span>，以及按地址调用(<em><span style="font-family: 宋体">call by reference</em>)</span>。当一个参数是按reference传递时，函数可以修改其原始值。Call by reference 的参数前面有一个地址号 <tt><span style="font-size: 12pt; line-height: 150%">&amp;</span></tt>跟在参数类型的后面，例如：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">void raiseSalary(Employee&amp; e, double by)</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">{ . . .</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">}</span></tt></p>
<p><strong><span style="color: red">下面是一个典型的利用call by reference的函数，</span></strong><strong><span style="font-size: 10.5pt; color: red; line-height: 150%">在Java中是无法实现这样的功能的</span><span style="color: red">。</span></strong></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">void swap(int&amp; a, int&amp; b)</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">{ int temp = a;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">a = b;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">b = temp;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">}</span></tt></p>
<p>如果使用 <tt><span style="font-size: 12pt; line-height: 150%">swap(x, y)</span></tt>来调用这个函数，则reference参数 <tt><span style="font-size: 12pt; line-height: 150%">a</span></tt>和 <tt><span style="font-size: 12pt; line-height: 150%">b</span></tt>指向原实际参数<tt><span style="font-size: 12pt; line-height: 150%">x</span></tt>和 <tt><span style="font-size: 12pt; line-height: 150%">y</span></tt>的位置，而不是它们的值的拷贝，因此这个函数可以实现实际交换这两个参数的值。</p>
<p><strong><span style="font-size: 10.5pt; color: red; line-height: 150%">在 C++中，每当需要实现修改原参数的值时你就可以使用按地址调用 call by reference 。</span></strong></p>
<p><strong>&nbsp;</strong></p>
<p><strong>&nbsp;</strong></p>
<p><strong>&nbsp;</strong></p>
<h2>6. 向量Vector</h2>
<p>C++ 的向量结构结合了Java中数组和向量两者的优点。一个C++ 的向量可以方便的被访问，其容量又可以动态的增长。如果 <tt><span style="font-size: 12pt; line-height: 150%">T</span></tt>是任意类型，则 <tt><span style="font-size: 12pt; line-height: 150%">vector&lt;T&gt;</span></tt>是一个元素为 <tt><span style="font-size: 12pt; line-height: 150%">T</span></tt>类型的动态数组。下面的语句</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">vector&lt;int&gt; a;</span></tt></p>
<p>产生一个初始为空的向量。而语句</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">vector&lt;int&gt; a(100);</span></tt></p>
<p>生成一个初始有100个元素的向量。你可以使用<tt><span style="font-size: 12pt; line-height: 150%">push_back</span></tt>函数来添加元素：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">a.push_back(n);</span></tt></p>
<p>调用 <tt><span style="font-size: 12pt; line-height: 150%">a.pop_back()</span></tt>从<tt><span style="font-size: 12pt; line-height: 150%">a</span></tt>中取出最后一个元素（操作后这个元素被从a中删掉)， 使用函数<tt><span style="font-size: 12pt; line-height: 150%">size</span></tt>可以得到当前a中的元素个数。</p>
<p>你还可以通过我们熟悉的 <tt><span style="font-size: 12pt; line-height: 150%">[]</span></tt>操作符来访问向量中元素，例如：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">for (i = 0; i &lt; a.size(); i++) {</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">sum = sum + a[i];</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">}</span></tt></p>
<p>同Java中一样，数组索引必须为 0 和<tt><span style="font-size: 12pt; line-height: 150%">a.size() - 1</span></tt>之间的值。但是与Java不同的是，C++中没有runtime的索引号合法性检验。试图访问非法的索引位置可能造成非常严重的出错。</p>
<p>就像所有其它 C++ 对象一样，向量也是值。如果你将一个向量赋值给另外一个向量变量，所有的元素都会被拷贝过去。</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">vector&lt;int&gt; b = a; /* </span></tt><tt><span style="font-size: 12pt; line-height: 150%">所有的元素都被拷贝了 */</span></tt></p>
<p>对比Java中的情况，在Java中，一个数组变量是一个指向数组的reference。拷贝这个变量仅仅产生另外一个指向同一数组的reference，而不会拷贝每一个元素的值。</p>
<p>正因如此，如果一个C++函数要实现修改向量的值，必须使用reference参数：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">void sort(vector&lt;int&gt;&amp; a)</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">{ . . .</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">}</span></tt></p>
<h2>7. 输入和输出</h2>
<p>在C++中，标准的输入输出流用对象 <tt><span style="font-size: 12pt; line-height: 150%">cin</span></tt>和 <tt><span style="font-size: 12pt; line-height: 150%">cout</span></tt>表示。我们使用 <tt><span style="font-size: 12pt; line-height: 150%">&lt;&lt;</span></tt>操作符写输出，例如：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">cout &lt;&lt; &#8220;Hello, World!&#8221;;</span></tt></p>
<p>也可以连着输出多项内容，例如：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">cout &lt;&lt; &#8220;The answer is &#8221; &lt;&lt; x &lt;&lt; &#8220;"n&#8221;;</span></tt></p>
<p>我们使用 <tt><span style="font-size: 12pt; line-height: 150%">&gt;&gt;</span></tt>操作符来读入一个数字或单词，例如：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">double x;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">cout &lt;&lt; &#8220;Please enter x: &#8220;;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">cin &gt;&gt; x;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">string fname;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">cout &lt;&lt; &#8220;Please enter your first name: &#8220;;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">cin &gt;&gt; fname;</span></tt></p>
<p>函数<tt><span style="font-size: 12pt; line-height: 150%">getline</span></tt>可以读入整行的输入，例如：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">string inputLine;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">getline(cin, inputLine);</span></tt></p>
<p>如果到达输入的结尾，或者一个数字无法被正确的读入，这个流对象会被设置为 failed 状态，我们可以使用函数 <tt><span style="font-size: 12pt; line-height: 150%">fail</span></tt>来检验这个状态，例如：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">int n;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">cin &gt;&gt; n;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">if (cin.fail()) cout &lt;&lt; &#8220;Bad input&#8221;;</span></tt></p>
<p>一旦一个流的状态被设为failed，我们是很难重置它的状态的，所以如果你的程序需要处理错误输入的情况，应该使用函数 <tt><span style="font-size: 12pt; line-height: 150%">getline</span></tt>然后人工处理得到的输入数据。</p>
<h2>8. 指针pointer</h2>
<p><strong><span style="color: red">我们已经知道在C++中，对象变量直接存储的是对象的值。这是与Java不同的，在Java中对象变量存储的是一个地址，该地址指向对象值实际存储的地方。有时在C++中也需要实现这样的布置，这就用到了指针pointer。在 C++中，一个指向对象的变量叫做指针。如果T是一种数据类型，则 </span></strong><tt><strong><span style="font-size: 12pt; color: red; line-height: 150%">T*</span></strong></tt><strong><span style="color: red">是指向这种数据类型的指针。</span></strong></p>
<p>就像 Java中一样，一个指针变量可以被初始化为空值 <tt><span style="font-size: 12pt; line-height: 150%">NULL</span></tt>，另外一个指针变量的值，或者一个调用new生成的新对象：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">Employee* p = NULL;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">Employee* q = new Employee(&#8221;Hacker, Harry&#8221;, 35000);</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">Employee* r = q;</span></tt></p>
<p><strong><span style="color: red">实际上在C++中还有第四种可能，那就是指针可以被初始化为另外一个对象的地址，这需要使用地址操作符 </span></strong><tt><strong><span style="font-size: 12pt; color: red; line-height: 150%">&amp;</span></strong></tt><strong><span style="color: red">：</span></strong></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">Employee boss(&#8221;Morris, Melinda&#8221;, 83000);</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">Employee* s = &amp;boss;</span></tt></p>
<p><strong><span style="color: red">这实际上并不是什么好主意。保险的做法还是应该直接让指针指向使用 </span></strong><tt><strong><span style="font-size: 12pt; color: red; line-height: 150%">new</span></strong></tt><strong><span style="color: red">生成的新对象。</span></strong></p>
<p><strong><span style="color: red">到目前为止，</span><span style="color: blue">C++ </span><span style="color: blue">指针</span><span style="color: red">看起来非常像 </span><span style="color: blue">Java </span><span style="color: blue">的对象引用变量</span><span style="color: red">。然而，这里有一个很重要的语法的不同。</span></strong>我们必须使用星号操作符 <tt><span style="font-size: 12pt; line-height: 150%">*</span></tt>来访问指针指向的对象。如果 <tt><span style="font-size: 12pt; line-height: 150%">p</span></tt>是一个指向<tt><span style="font-size: 12pt; line-height: 150%">Employee</span></tt>对象的指针，则 <tt><span style="font-size: 12pt; line-height: 150%">*p</span></tt>才代表了这个对象：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">Employee* p = . . .;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">Employee boss = </span></tt><strong><span style="font-family: 宋体">*p</span></strong><tt><span style="font-size: 12pt; line-height: 150%">;</span></tt></p>
<p>当我们需要执行对象的函数或访问对象的一个数据域时，也需要使用 <tt><span style="font-size: 12pt; line-height: 150%">*p</span></tt>：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">(*p).setSalary(91000);</span></tt></p>
<p>*p外面的括号是必需的，因为 <tt><span style="font-size: 12pt; line-height: 150%">.</span></tt>操作符比 * 操作符有更高的优先级。C的设计者觉得这种写法很难看，所以他们提供了另外一种替代的写法，使用 -&gt; 操作符来实现 <tt><span style="font-size: 12pt; line-height: 150%">*</span></tt>和 <tt><span style="font-size: 12pt; line-height: 150%">.</span></tt>操作符的组合功能。表达式</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">p-&gt;setSalary(91000);</span></tt></p>
<p>可以调用对象*p的函数 <tt><span style="font-size: 12pt; line-height: 150%">setSalary</span></tt>。你可以简单的记住<tt><strong><span style="font-size: 12pt; color: blue; line-height: 150%">.</span></strong></tt><strong><span style="color: blue">操作符是在对象上使用的，-&gt; 操作符是在指针上使用的。</span></strong></p>
<p><strong><span style="color: blue">如果你不初始化一个指针，或者如果一个指针为空值 NULL 或指向的对象不再存在，则在它上面使用 </span></strong><tt><strong><span style="font-size: 12pt; color: blue; line-height: 150%">*</span></strong></tt><strong><span style="color: blue">或 </span></strong><tt><strong><span style="font-size: 12pt; color: blue; line-height: 150%">-&gt;</span></strong></tt><strong><span style="color: blue">操作符就会出错。 不幸的是 C++ runtime 系统并不检查这个出错。如果你范了这个错误，你的程序可能会行为古怪或死机。</span></strong></p>
<p><strong>&nbsp;</strong></p>
<p>而在Java中，这些错误是不会发生的。所有的reference都必须初始化，所有的对象只要仍有reference指向它就不会被从内存中清除，因此你也不会有一个指向已被删除的对象的reference。Java的runtime 系统会检查reference是否为空，并在遇到空指针时抛出一个null pointer的例外(exception)。</p>
<p><strong><span style="color: blue">C++ </span><span style="color: blue">和 Java还有一个显著的不同，就是 Java 有<em><span style="font-family: 宋体">垃圾回收</span></em>功能，能够自动回收被废弃的对象。而在C++中，需要程序员自己管理内存分配回收。</span></strong></p>
<p>C++中当对象变量超出范围时可以自动被回收。但是使用new生成的对象必须用delete操作符手动删除，例如：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">Employee* p = new Employee(&#8221;Hacker, Harry&#8221;, 38000);</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">. . .</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">delete p; /* </span></tt><tt><span style="font-size: 12pt; line-height: 150%">不在需要这个对象 */</span></tt></p>
<p>如果你忘记删除一个对象，那么你的程序有可能最终用光所有内存。这就是我们常说的内存泄漏 (<em><span style="font-family: 宋体">memory leak</em>)</span>。更重要的是，如果你如果删除了一个对象，然后又继续使用它，你可能覆盖不属于你的数据。如果你刚巧覆盖了用于处理内存回收的数据域，那么内存分配机制就可能运转失常而造成更严重的错误，而且很难诊断和修复。因此，在C++中最好尽量少用指针。</p>
<h2>9. 继承</h2>
<p>C++和Java中继承的基本语法是很相似的。在C++中，使用 <tt><span style="font-size: 12pt; line-height: 150%">: public</span></tt>代替Java中的<tt><span style="font-size: 12pt; line-height: 150%">extends</span></tt>来表示继承关系 。 (C++ 也支持私有继承的概念，但是不太有用。)</p>
<p>默认情况下，C++中的函数不是动态绑定的。如果你需要某个函数实现动态绑定，需要使用<tt><span style="font-size: 12pt; line-height: 150%">virtual</span></tt>声明它为虚函数，例如：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">class Manager : public Employee</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">{ </span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">public:</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">Manager(string name, double salary, string dept);</span></tt></p>
<p><strong><span style="font-family: 宋体">virtual</span></strong><tt><span style="font-size: 12pt; line-height: 150%"> void print() const;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">private:</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">string department;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">};</span></tt></p>
<p>同Java一样，构造函数中调用父类的构造函数有特殊的语法。 Java使用关键字 <tt><span style="font-size: 12pt; line-height: 150%">super</span></tt>。C++中必须在子类的构造函数体外调用父类的构造函数。下面是一个例子：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">Manager::Manager(string name, double salary, string dept)</span></tt></p>
<p><strong><span style="font-family: 宋体">: Employee(name, salary) </span></strong><tt><span style="font-size: 12pt; line-height: 150%">/* </span></tt><tt><span style="font-size: 12pt; line-height: 150%">调用父类的构造函数 */</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">{ department = dept;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">}</span></tt></p>
<p>Java 中在子类函数中调用父类的函数时也使用关键字 <tt><span style="font-size: 12pt; line-height: 150%">super</span></tt>。而在C++中是使用父类的名称加上操作符 <tt><span style="font-size: 12pt; line-height: 150%">::</span></tt>表示，例如：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">void Manager::print() const</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">{ </span></tt><strong><span style="font-family: 宋体">Employee::print(); </span></strong><tt><span style="font-size: 12pt; line-height: 150%">/* </span></tt><tt><span style="font-size: 12pt; line-height: 150%">调用父类的函数 */</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">cout &lt;&lt; department &lt;&lt; &#8220;"n&#8221;;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">}</span></tt></p>
<p>一个 C++ 对象变量只能存储特定类型的对象值。要想在C++中实现多态(polymorphism)，必须使用指针。一个 <tt><span style="font-size: 12pt; line-height: 150%">T*</span></tt>指针可以指向类型为 <tt><span style="font-size: 12pt; line-height: 150%">T</span></tt>或 <tt><span style="font-size: 12pt; line-height: 150%">T</span></tt>的任意子类的对象，例如：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">Employee* e = new Manager(&#8221;Morris, Melinda&#8221;, 83000, &#8220;Finance&#8221;);</span></tt></p>
<p>你可以将父类和不同子类的对象混合收集到一个元素均为指针的向量中，然后调用动态绑定的函数，如下所示：</p>
<p><tt><span style="font-size: 12pt; line-height: 150%">vector&lt;Employee*&gt; staff;</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">. . .</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">for (i = 0; i &lt; staff.size(); i++)</span></tt></p>
<p><tt><span style="font-size: 12pt; line-height: 150%">staff[i]-&gt;print();</span></tt></p>
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/270049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-11 14:58 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270049.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>由一段C++例子想起的，主要关于C++中的上下转型问题</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/10/269940.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sun, 10 May 2009 13:13:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/10/269940.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/269940.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/10/269940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/269940.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/269940.html</trackback:ping><description><![CDATA[Base *p = new Sub<br />
void funOne(Sub &amp;s);<br />
在不向下转型的情况下是否能够直接这样调用funOne(*p)<br />
占位 <br />
指针，引用，对象
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/269940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-10 21:13 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/10/269940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++类成员变量初始化及与Java中的区别</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/10/269936.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sun, 10 May 2009 13:07:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/10/269936.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/269936.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/10/269936.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/269936.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/269936.html</trackback:ping><description><![CDATA[继承中的<br />
Java中的成员变量的初始化顺序<br />
<br />
C++中的成员变量的初始化顺序，主要是内置类型的变量是否给其赋初值了 <br />
C++中的内置类型primitive在全局区域（注意什么是全局区域)是会被系统自动初始化的 为0,在局部区域是不会被自动初始化的<br />
C++中的类类型的变量是会被自动初始化的，但要求其有默认的构造函数<br />
继承时C++的成员变量与Java中类似
<img src ="http://www.blogjava.net/fhtdy2004/aggbug/269936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-10 21:07 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/10/269936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++多重继承问题及虚继承virtual的问题</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/10/269935.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sun, 10 May 2009 12:57:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/10/269935.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/269935.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/10/269935.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/269935.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/269935.html</trackback:ping><description><![CDATA[占位 <br />
多重继承问题,二义性问题<br />
sizeof(A)的问题,普通继承和虚继承的差别
 <img src ="http://www.blogjava.net/fhtdy2004/aggbug/269935.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-10 20:57 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/10/269935.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>上一篇C++虚函数例子</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/08/269549.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Fri, 08 May 2009 02:44:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/08/269549.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/269549.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/08/269549.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/269549.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/269549.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/08/269549.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/269549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-08 10:44 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/08/269549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>*虚函数表与虚表指针(转)</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/08/269540.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Fri, 08 May 2009 02:15:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/08/269540.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/269540.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/08/269540.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/269540.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/269540.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/08/269540.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/269540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-08 10:15 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/08/269540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中与C++的又一不同点:子类,父类方法的重载，覆盖，隐藏</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269456.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 07 May 2009 09:37:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269456.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/269456.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/269456.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/269456.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269456.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/269456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-07 17:37 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 友元类和友元函数</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269418.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 07 May 2009 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269418.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/269418.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269418.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/269418.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/269418.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269418.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/269418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-07 15:10 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:RTTI特性小究(dynamic_cast转换操作符和typeid操作符)</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269414.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 07 May 2009 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269414.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/269414.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269414.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/269414.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/269414.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269414.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/269414.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-07 14:20 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269414.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用c++应注意的地方(一)</title><link>http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269412.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 07 May 2009 06:08:00 GMT</pubDate><guid>http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269412.html</guid><wfw:comment>http://www.blogjava.net/fhtdy2004/comments/269412.html</wfw:comment><comments>http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269412.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhtdy2004/comments/commentRss/269412.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhtdy2004/services/trackbacks/269412.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269412.html'>阅读全文</a><img src ="http://www.blogjava.net/fhtdy2004/aggbug/269412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-05-07 14:08 <a href="http://www.blogjava.net/fhtdy2004/archive/2009/05/07/269412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>