C ++运算符重载和受保护的字段

时间:2013-10-19 23:01:26

标签: c++ operator-overloading

我正在学习C ++,我们已经分配了使用堆栈和堆内存实现Vector3D类的任务。不小心,我注意到可以访问传递给重载+方法的Vector3DStack对象v的受保护成员字段x,y和z。

class Vector3DStack
{
public:
    Vector3DStack(double, double, double);

    double getMagnitude() const;

    double getX() const;
    double getY() const;
    double getZ() const;

    Vector3DStack operator + (Vector3DStack);
    Vector3DStack operator - (Vector3DStack);
    Vector3DStack operator * (double);
    Vector3DStack operator / (double);
    Vector3DStack operator % (Vector3DStack);

    double operator * (Vector3DStack);

protected:
    double x, y, z;
};

为什么C ++允许在将它们声明为受保护时访问Vector3DStack参数v上的x,y和z受保护字段?我原本希望使用v.getX(),v.getY()和v.getZ()。

Vector3DStack Vector3DStack::operator + (Vector3DStack v)
{
    return Vector3DStack (x + v.x, y + v.y, z + v.z);
}

非常感谢, 乔治

1 个答案:

答案 0 :(得分:1)

因为您已将operator+函数实现为成员函数。

如果是

Vector3DStack operator + (const Vector3DStack& v);

它并不重要 - 它正在添加 Vector3DStack 类的两个对象。

重要的是

Vector3DStack operator * (double s);

在这种情况下,您只能将Vector3DStack作为左值,因此:

... 
vec = vec + 5; // is ok
vec = 5 + vec; // isn't

对于第二个版本,您需要在类外部实现重载:

Vector3DStack operator * (double s, const Vector3DStack& v);
Vector3DStack operator * (const Vector3DStack& v, double s);

在这种情况下,运算符函数将无法访问类Vector3DStack的私有成员。

在这种情况下,您可以将运算符函数声明为 friend - 友元函数可以访问类的私有成员。

附加更新:您应该通过const引用传递对象。