此运算符重载函数返回的内容

What is returned by this operator overloading function?

本文关键字:返回 函数 运算符 重载      更新时间:2023-10-16

>我有一个页面中的以下列表:

#include "vector.h"
// An axis-aligned bounding box
class AABB
{
  public:
    VECTOR P; //position
    VECTOR E; //x,y,z extents
    AABB( const VECTOR& p, const VECTOR& e): P(p) ,E(e) {}
    // ...
    const SCALAR min( long i ) const
    {
      return ((AABB*)this)->P[i] - ((AABB*)this)->E[i];
    }
    // ...
};

现在我不明白的是,min(( 用长值访问了什么。我调查了vector.h,发现方括号运算符已重载:

class VECTOR
{
  public:
    SCALAR x,y,z; //x,y,z coordinates
    //...
    //index a component
    //NOTE: returning a reference allows
    //you to assign the indexed element
    SCALAR& operator [] ( const long i )
    {
      return *((&x) + i);
    }
    //...
};

后来它被用作:

// each axis
for( long i=0 ; i<3 ; i++ )
{
  if( A.max(i)<B.min(i) && v[i]<0 )
  {

那么,为什么x值参考会增加i呢?
如果这个问题很容易,请耐心等待,我仍然是一个菜鸟。如果这还不够,我可以提供实际来源

它不会递增。

&x  //<- address of member x
(&x) + i //<- address of member x shifted right by i SCALAR's
*((&x) + i) // the scalar value at that point

因此,*((&x) + i)返回第 i 个标量。 x 表示 0,y 表示 1,z 表示 2。

称为指针算术。

在代码中,&x 采用指针x的地址;添加i意味着指针递增 sizeof(x) * i 个。通常,这样做是为了达到与索引到数组中相同的效果。例如,如果您有

int arr[10];

然后,通过写入&arr[0] + i可以有效地索引到数组中的第 i 个整数。在某些情况下,可能存在一些其他类型的连续内存块,而不是标准数组。

这在所讨论的情况下并不完全是发生的事情,因为这里没有数组或其他此类内存块。相反,代码假定编译器将计算VECTOR的内存布局,以便将xyz并排放置在内存中,模拟数组布局。

但是,这种做法根据C++标准调用未定义的行为,因此VECTOR的这种实现是有缺陷的,不应使用。

operator[]中执行的操作是"指针算术" - 使用普通的算术运算符(在这种情况下+(使用指针(通常使用数组(导航内存。

您可以在此处查看此技术的更多示例:http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/pointer.html

应该注意的是,如果SCALAR是某种非数组类型,那么我认为给出的代码是"危险的">,因为它假设xyz将位于相邻的内存位置,这是标准C++无法保证的。如果您尝试在不能保证此假设的平台上使用此代码,结果将是operator[]充其量会返回一些未定义的值,或者最坏的情况会导致分段错误。

这是指针算术。

VECTOR 结构中,SCALAR成员可能会(不能保证(连续出现在内存中,而该代码的作者通过向结构中第一个成员的内存地址添加索引来利用这一点 ( x (。

以下是输入映射到输出的方式:

  • 0...... *(&x + 0)...... x
  • 1...... *(&x + 1)...... y
  • 2...... *(&x + 2)...... z

然而,这是作者一个非常不安全的假设:V。
(填充字节、成员顺序等(