2013-06-11 73 views
-2

有人能解釋一下下面的程序如何成爲infinte循環 「AabAabAab ..」C++運算符重載構造

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

class Base { 
public: 
    Base(int j=1):i(j) 
    {cout<<"B";} 
private: 
    int i; 
}; 

class Case{ 
public: 
    Case(int j=1):i(j) {cout<<"A";} 
    operator Base() { cout<<"ab"; return *(new Case); } 
private: 
    int i; 
}; 

int main() 
{ 
    Base obj = Case(); 
    return 0; 
} 
+0

它在vC++編輯器上運行良好。 – RDX

+0

哇。這將是一個很好的面試問題 – AlexK

回答

7
Base obj = Case(); 

這將調用Case默認的構造函數,打印A。然後,有從這個操作,其具有無限遞歸轉換到Base

operator Base() { cout<<"ab"; return *(new Case); } 

因爲它嘗試返回Case實例(打印abA),其必須被轉換爲Base,這將調用的轉換運算符,它創建了一個Case實例(打印abA),它必須是轉換器Base,這...

1

有人能解釋一下下面的程序成爲infinte循環「AabAabAab ..」

不是真的無限。由於堆棧溢出,最終會導致程序崩潰。這是怎麼回事。在這裏:

Base obj = Case(); 

您正在創建Case類型的臨時對象,並用它來初始化Base類型的對象。

可以做到這一點的唯一方法是通過拾取的Case的用戶定義的轉換運算符,它可以返回Base

現在又將這一轉換操作符恰好創造Case類型的臨時對象,從操作者的返回值應該被初始化:

return *(new Case); 

由於返回值是Base類型本身,暫時現在必須轉換爲類型爲Base的對象 - 並且由於臨時類型爲Case,因此再次調用相同的用戶定義的轉換運算符。

這是什麼嘗試生成無限遞歸。但是,由於每個函數調用都需要創建一個堆棧幀,所以您的多餘遞歸最終會導致堆棧溢出,並且您的進程將被終止。