我正在学习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);
}
非常感谢, 乔治
答案 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引用传递对象。