我正在学习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/