4

我一直在查看源代码,试图了解有关 C++ 的更多信息,但遇到了一些看起来令人困惑的代码。我无法通过玩弄它来弄清楚它的用途。

请有人能解释一下操作符 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,它看起来像是一个转换运算符,但我仍然不确定它的实际作用以及它为什么有用。

亲切的问候,

4

3 回答 3

10

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

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

不用说,这种特殊的转换非常糟糕,因为它的效果非常不直观,并且很容易导致无法找到错误。隐式转换通常应该小心处理,因为它们隐藏了潜在的混淆语义。但是它们可以很好地与应该可以互换使用的类型一起使用,并且转换不会造成伤害。

例如,考虑您编写自己的类integercomplex类的情况。从integerto的转换complex是无害的,因为每个整数都是复数(反之亦然)。所以进行隐式转换integercomplex是安全的。

于 2014-06-17T10:22:40.303 回答
6

据说它是一个转换运算符,将类型对象转换为类型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 条)的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址

所以定义了类的数据成员的顺序。

于 2014-06-17T10:25:29.777 回答
3

它是一个转换运算符,允许将类与需要 . 的 API 一起使用float*。您有两个不同的版本,因为一个会将类转换为 a const float*,另一个将转换为非const. 但是,非常量转换运算符会破坏您的类的封装。

有用性:正如我所提到的,当您想要使用需要某种类型的库时,它会非常方便。当两种类型之间存在自然转换时,它也很有用。

于 2014-06-17T10:21:24.377 回答