有人可以解释下面程序如何成为“AbaAabab ..”的无限循环
#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 :(得分:7)
Base obj = Case();
这会调用Case
默认构造函数,打印A
。然后,通过此运算符转换为Base
,该运算符具有无限递归:
operator Base() { cout<<"ab"; return *(new Case); }
因为它尝试返回Case
实例(打印abA
),必须将其转换为Base
,这会调用转换运算符,从而创建Case
实例(打印abA
),必须转换为Base
,其中...... {/ p>
答案 1 :(得分:1)
有人可以解释下面的程序如何成为“AabAabAab ..”的infinte循环
不是真的无限。由于堆栈溢出,这最终会导致程序崩溃。这是正在发生的事情。这里:
Base obj = Case();
您正在创建Case
类型的临时对象,并使用它来初始化Base
类型的对象。
这样做的唯一方法是选择Case
的用户定义转换运算符,该运算符可以返回Base
。
现在,这个转换运算符反过来会创建一个Case
类型的临时对象,应该从该对象初始化运算符的返回值。
return *(new Case);
由于返回值本身是Base
类型,因此临时现在必须转换为类型为Base
的对象 - 并且由于临时值具有类型Case
,因此相同的用户 - 再次调用定义的转换运算符。
这是尝试生成无限递归的原因。但是,由于每个函数调用都需要创建一个堆栈帧,因此无休止的递归最终会导致堆栈溢出,并且您的进程将被终止。