C ++构造函数调用 - 需要帮助确定如何进行某些调用

时间:2010-12-04 21:44:23

标签: c++ syntax polymorphism

class PayOffBridge
{
public:

    PayOffBridge();
    PayOffBridge(const PayOffBridge& original);
    PayOffBridge(const PayOff& innerPayOff);

    inline double operator()(double Spot) const;
    ~PayOffBridge();
    PayOffBridge& operator=(const PayOffBridge& original);

private:

    PayOff* ThePayOffPtr;

};

和另一个具有成员的类,该成员是class PayOffBridge的对象:

class VanillaOption
{
public:

    VanillaOption(const PayOffBridge& ThePayOff_, double Expiry);

    double OptionPayOff(double Spot) const;
    double GetExpiry() const;

private:

    double Expiry;
    PayOffBridge ThePayOff;
};

PayOff* ThePayOffPtr中的PayOffBridge是指向以下纯虚拟抽象类的指针:

class PayOff
{
public:

    PayOff(){};

    virtual double operator()(double Spot) const=0;
    virtual ~PayOff(){}
    virtual PayOff* clone() const=0;

private:

};

具体类PayOffCall派生自PayOff。在main()我有

PayOffCall thePayOff(Strike);//double Strike
VanillaOption theOption(thePayOff, Expiry);//double Expiry

当我在Visual Studio中使用F11单步执行代码时,行VanillaOption theOption(thePayOff, Expiry);最终会调用PayOffBridge(const PayOff& innerPayOff);。我无法弄清楚它被调用的地方。 VanillaOption的构造函数如何最终调用它?

我的第二个问题是从VanillaOption调用的main()的构造函数

VanillaOption::VanillaOption(const PayOffBridge& ThePayOff_, double Expiry_): ThePayOff(ThePayOff_), Expiry(Expiry_)
{
}

ThePayOff(ThePayOff_)究竟做了什么?也就是说,PayOffBridge的哪个构造函数被调用,如果有的话,这个语法究竟完成了什么?

2 个答案:

答案 0 :(得分:2)

第一个答案

VanillaOption期望PayOffBridge对象作为构造函数参数。但是,您将传递PayOffCall对象。编译器寻找从给定的PayOffBridge对象构造临时PayOffCall对象的方法。

它有PayOffBridge(const PayOff& innerPayOff);个构造函数。因此,它需要引用PayOff对象进行构造。但是,PayOffCall源自PayOff,因此const PayOffCall&会隐式转换为const PayOff&,而您会构建PayOffBridge

第二个回答

ThePayOff(ThePayOff_)表示对象构造。首先,您应该识别这些变量的类型。

const PayOffBridge& ThePayOff_ - 输入参数

PayOffBridge ThePayOff - VanilaOption

的成员

因此,PayOffBridge对象是从另一个PayOffBridge对象构造的。显然,复制构造函数被称为

PayOffBridge(const PayOffBridge& original);

答案 1 :(得分:1)

您使用的VanillaOption构造函数有一个 initialization list 来构建它的内部成员。这是为PayoffBridge调用 copy 构造函数,将ThePayoff_复制到ThePayoff

VanillaOption::VanillaOption(const PayOffBridge& ThePayOff_, double Expiry_):
    ThePayOff(ThePayOff_), 
    Expiry(Expiry_)
{
}

此构造函数的“body”故意为空,因为所有工作都是由初始化列表完成的。