operator float *()有什么作用?

时间:2014-06-17 10:20:21

标签: c++ conversion-operator

我一直在查看源代码,试图了解有关C ++的更多信息,但我发现了一些令人困惑的代码。我还没有能够通过玩弄它来弄清楚它的用途。

有人可以解释操作符浮动*()的作用以及如何使用它吗?

class Vector
{
public:
    float x,y,z;

Vector() : x(0), y(0), z(0){ } Vector( float x, float y, float z ) : x(x), y(y), z(z){ } operator float*(){ return &x; } operator const float *(){ return &x; }

我搜索过StackOverflow,它看起来像是一个转换操作符,但我仍然不确定它实际上是做什么以及为什么它有用。

亲切的问候,

3 个答案:

答案 0 :(得分:8)

operator type_name声明隐式转换运算符。换句话说,当您尝试(隐式)将类型的对象转换为float*时,将调用此函数 - 例如在赋值中:

Vector x(1, 2, 3);
float* f = x;
assert(*f == 1);

毋庸置疑,这种特殊的转换非常糟糕,因为它的效果非常不直观,很容易导致无法找到错误。隐式转换通常应谨慎处理,因为它们隐藏了可能令人困惑的语义。但是它们可以用于那些应该互换使用的类型,并且转换不会受到伤害。

例如,考虑您编写自己的integercomplex类的情况。从integercomplex的转换是无害的,因为每个整数都是有效的复数(但不是反之亦然)。因此,隐式转化integercomplex是安全的。

答案 1 :(得分:5)

据说它是一个转换运算符,它将Vector类型的对象转换为类型为float *的对象。可以隐式调用此转换运算符,因为它没有函数说明符explicit

我认为引入此运算符的想法是将数据成员x,y,z作为浮点数组来访问。在这种情况下,您可以将一些标准算法应用于类的对象,将其转换为浮点数组。

考虑到第二个重载的运算符函数应具有限定符const。

考虑以下代码

#include <iostream>
#include <algorithm>


class Vector
{
public:
    float x,y,z;



    Vector() : x(0), y(0), z(0){
    }

    Vector( float x, float y, float z ) : x(x), y(y), z(z){
    }

    operator float*(){
        return &x;
    }

    operator const float *() const {
        return &x;
    }
};

int main() 
{
    Vector v( 1, 3, 2 );
    auto max = std::max_element( v + 0, v + 3 );
    std::cout << *max << std::endl;

    return 0;
}

输出为3。

考虑到根据C ++标准

  

13具有相同访问权限的(非联合)类的非静态数据成员   控制(第11条)被分配,以便以后的成员有更高的成员   类对象中的地址

因此定义了类的数据成员的顺序。

答案 2 :(得分:3)

这是一个转换运算符,允许该类与需要float*的API一起使用。您有两个不同的版本,因为一个将类转换为const float*而另一个将转换为非{ {1}}。非const转换运算符会破坏类的封装。

有用性:正如我所提到的,当你想要一个需要特定类型的库时,它可以非常方便。当两种类型之间存在自然转换时,它也很有用。