当调用构造函数和运算符函数时

时间:2012-04-01 12:16:10

标签: c++ constructor operator-keyword copy-constructor

class apple
{
  public :
    operator orange () const { cout << "operator"; }
} ;
class orange
{
  public :
    orange (apple &x ){cout <<"constructor";}
};
void f(orange o)
{
  cout <<"function can accept only oranges ";
}
int main()
{
  apple a;
  f(a);
}

输出: 编译器错误

为什么这段代码会给g ++编译器带来编译错误?当函数f被调用时,为什么不调用橙色的构造函数?

2 个答案:

答案 0 :(得分:4)

你有一个循环依赖:

class apple
{
public :
   operator orange () const { cout << "operator"; } //depends on orange
                                                    //shouldn't compile
} ;
class orange
{
public :
   orange (apple &x ){cout <<"constructor";} //depends on apple
};

我很惊讶你没有收到编译器错误。无论如何,您需要在定义orange之前定义apple,并且不需要运算符orange

class apple;
class orange
{
public :
   orange (apple &x ){cout <<"constructor";}
};
class apple
{
public :
};

这应该有用。

答案 1 :(得分:2)

您的operator orange()不会返回任何值。转换运算符的所有要点是将您的实例从类型A转换为类型B.

您应该创建一个橙色实例并将其返回。 (虽然我真的没有看到将苹果变成橙色的感觉:))