-2

有人能解释一下下面的程序如何变成“AabAabAab..”的无限循环吗?

#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;
}
4

2 回答 2

7
Base obj = Case();

这将调用Case默认构造函数打印A。然后,通过此运算符进行转换,Base该运算符具有无限递归:

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

因为它试图返回一个Case实例 (prints abA),该实例必须转换为Base,它调用转换运算符,它创建一个Case实例 (prints abA),该实例必须转换为Base,它...

于 2013-06-11T19:02:41.123 回答
2

有人能解释一下下面的程序如何变成“AabAabAab..”的无限循环吗?

不是真的无限。由于堆栈溢出,这最终会使您的程序崩溃。这就是正在发生的事情。这里:

Base obj = Case();

您正在创建一个临时类型的对象Case并使用它来初始化一个类型的对象Base

唯一可以做到这一点的方法是选择用户定义的转换运算符 of Case,它可以返回一个Base.

现在这个转换运算符又碰巧创建了一个类型为 的临时对象,Case应该从中初始化运算符的返回值。:

return *(new Case);

由于返回值本身是 type Base,所以现在必须将临时对象转换为 type 对象Base- 并且由于临时对象具有 type Case,所以再次调用相同的用户定义转换运算符。

这就是试图生成无限递归的原因。但是,由于每个函数调用都需要创建一个堆栈帧,因此您无休止的递归最终会导致堆栈溢出,并且您的进程将被终止。

于 2013-06-11T19:05:07.950 回答