0

我正在学习 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);
}

非常感谢,乔治

4

1 回答 1

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);

在这种情况下, operator 函数将无法访问 class 的私有成员Vector3DStack

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

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

于 2013-10-19T23:03:56.587 回答