C ++运算符重载构造函数

时间:2013-06-11 18:59:43

标签: c++ constructor operator-overloading

有人可以解释下面程序如何成为“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;
}

2 个答案:

答案 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,因此相同的用户 - 再次调用定义的转换运算符。

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