一會兒再把分析轉(zhuǎn)過來。
#include<iostream>
using namespace std;
class A
{
public:
A(int n):val(n){}
protected:
int val;
};
class B:public A
{
public:
B(int n):A(n)
{
pB=(n>0? new B(n-1):0);
}
~B(){delete pB;}
void Display()
{
cout << val << endl;
if(pB!=0)pB->Display();
}
private:
B *pB;
};
int main()
{
B b(4);
b.Display();
return 0;
}
==================================================================
程序的運行結(jié)果是:
4
3
2
1
0
===================================================================
tangshuiling 給出的解釋:
B(int n):A(n)
{
pB=(n>0? new B(n-1):0);
}
B b(4); /**用 4 初始化 A 類成員 val, val=4*/
/**此時 n=4 滿足大于 0 的條件,調(diào)用 new B(3),同時棧要維護現(xiàn)場,
存儲 val=4,pb=new B(3) 產(chǎn)生的對象地址設(shè)為 pb1 以及函數(shù)的下個語句
地址,此時是‘}’就相當(dāng)于return。
*/
依次類推棧中保存了 (val=4,pb1) (val=3,pb2) (val=2,pb3) (val=1,pb4) 最后 val=0, pb=0
,遇到‘}’符號本應(yīng)該 return 的,但由于此時棧不空,因此還必須做出棧的操作,因此,最后出棧是:val=4, pb1。
b.Display();
調(diào)用此句,顯然此時 val=4,pb=pb1 pb1->display(); 此時 val 應(yīng)該是
等于3,pb1=new B(3); 依次類推:
pb2->display(); val=2
pb3->display(); val=1
pb4->display(); val=0
此時 pb=0,不滿足調(diào)用條件直接 return 了
from:http://topic.csdn.net/u/20090109/00/67841ac5-3197-4842-b0e9-ce3c6aa962d9.html