C ++访问私有成员

时间:2012-10-17 18:04:47

标签: c++

您好我正在阅读Joshi的C ++设计模式和衍生产品定价中的第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的复制构造函数如何访问原始的私有成员,即为什么我可以执行thePayOffPtr = original.thePayOffPtr-> clone();和到期= original.Expiry;。任何人都可以帮忙吗?非常感谢提前。

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:1)

想到它的方法是一个类可以访问它自己的私有部分。如果它不能,那么你必须编写方法来公开实现,以便于复制构造等事情,这会破坏封装。

答案 2 :(得分:0)

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