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
的哪个构造函数被调用,如果有的话,这个语法究竟完成了什么?
答案 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”故意为空,因为所有工作都是由初始化列表完成的。