operator float*()有什么作用?

NoO*_*dle 4 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; }
Run Code Online (Sandbox Code Playgroud)

我已经搜索了StackOverflow,它看起来像是一个转换运算符,但我仍然不确定它实际上是做什么以及为什么它有用.

亲切的问候,

Kon*_*lph 9

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

Vector x(1, 2, 3);
float* f = x;
assert(*f == 1);
Run Code Online (Sandbox Code Playgroud)

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

例如,考虑您编写自己的类integercomplex类的情况.从A变换integercomplex是无害的,因为每一个整数是一个有效的复合物(但不是反之亦然).所以进行隐式转换integercomplex是安全的.


Vla*_*cow 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;
}
Run Code Online (Sandbox Code Playgroud)

输出为3.

考虑到根据C++标准

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

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