1

嗨,我正在阅读 Joshi 的 C++ Design Patterns and Derivatives Pricing 的第 4 章,但我不理解代码的某些部分。我们有一个 PayOff 类,我们想定义一个以 PayOff 作为成员的 VanillaOption 类。为了有效地做到这一点,他使用了一个虚拟复制构造函数。

#ifndef PAYOFF_H
#define PAYOFF_H

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

class PayOffCall : public PayOff
{
private:
    double Strike;
public:
    PayOffCall(double Strike_);
    virtual PayOff* clone(){return new PayOffCall(*this);}
    virtual ~PayOffCall(){}
};
#endif 



#ifndef VO_H
#define VO_H
#include "PayOff.h"

class VanillaOption
{
private:
PayOff* ThePayOffPtr;               
double Expiry;
public:
VanillaOption(PayOff&,double );     //constructor
VanillaOption(VanillaOption& original) {thePayOffPtr = original.thePayOffPtr->clone(); Expiry = original.Expiry;}       //copy constructor
VanillaOption& operator=(VanillaOption&);       

~VanillaOption();
 };





#endif

我不明白 VanillaOption 的复制构造函数如何访问 original 的私有成员,即为什么我可以这样做 thePayOffPtr = original.thePayOffPtr->clone(); 和到期=原始。到期;。有人可以帮忙吗?提前谢谢了。

4

3 回答 3

8

访问控制适用于整个类,而不是实例。类的方法可以访问在该类中定义的私有成员,甚至在该类的其他对象上。即使构造函数在不同的对象 ( this != &original) 上运行,您仍然可以访问私有成员,original因为构造函数是定义私有成员的类的一部分。

请记住:方法和构造函数属于类本身,而不是实例!

于 2012-10-17T18:07:22.870 回答
1

考虑它的方式是一个类可以访问它自己的私有部分。如果不能,那么您必须编写方法来公开实现以促进复制构造之类的事情,这会损害封装。

于 2012-10-17T18:44:21.027 回答
0

在为一个类编码时,如果您需要访问某个其他类的成员(即时变量或方法),则它们必须是公共的。可以通过为该类创建一个对象从任何类访问该类的公共成员.getter 和 setter 方法是理解这一点的好例子。通常即时变量被声明为私有,而方法被声明为公共。所以我们只能使用这些方法来访问即时变量,而不能直接使用。

于 2012-10-17T18:17:38.107 回答