我正在学习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 ++声明为protected时,为什么允许访问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);
}


非常感谢,
乔治

最佳答案

因为您已将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类的私有成员。

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

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

关于c++ - C++运算符重载和 protected 字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19472078/

10-11 17:06