此运算符重载函数返回的内容
What is returned by this operator overloading function?
>我有一个页面中的以下列表:
#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
的内存布局,以便将x
、y
和z
并排放置在内存中,模拟数组布局。
但是,这种做法根据C++标准调用未定义的行为,因此VECTOR
的这种实现是有缺陷的,不应使用。
operator[]
中执行的操作是"指针算术" - 使用普通的算术运算符(在这种情况下+
(使用指针(通常使用数组(导航内存。
您可以在此处查看此技术的更多示例:http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/pointer.html
应该注意的是,如果SCALAR
是某种非数组类型,那么我认为给出的代码是"危险的">,因为它假设x
、y
和z
将位于相邻的内存位置,这是标准C++无法保证的。如果您尝试在不能保证此假设的平台上使用此代码,结果将是operator[]
充其量会返回一些未定义的值,或者最坏的情况会导致分段错误。
这是指针算术。
在 VECTOR
结构中,SCALAR
成员可能会(不能保证(连续出现在内存中,而该代码的作者通过向结构中第一个成员的内存地址添加索引来利用这一点 ( x
(。
以下是输入映射到输出的方式:
-
0
......*(&x + 0)
......x
-
1
......*(&x + 1)
......y
-
2
......*(&x + 2)
......z
然而,这是作者一个非常不安全的假设:V。
(填充字节、成员顺序等(
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数