gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:21:03 25 4
gpt4 key购买 nike

我正在学习 C++,我们被分配了使用堆栈和堆内存实现 Vector3D 类的任务。偶然地,我注意到可以访问传递给重载 + 方法的 Vector3DStack 对象 v 的 protected 成员字段 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 protected 字段,当它们被声明为 protected 时?我本以为必须使用 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 类的私有(private)成员。

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com