操作符float*()做什么? 我一直在查看源代码,试图了解更多关于C++的内容,我发现了一些看起来很混乱的代码。我一直无法通过玩弄它来了解它的用途

操作符float*()做什么? 我一直在查看源代码,试图了解更多关于C++的内容,我发现了一些看起来很混乱的代码。我一直无法通过玩弄它来了解它的用途,c++,class,operator-overloading,overloading,conversion-operator,C++,Class,Operator Overloading,Overloading,Conversion Operator,请有人解释一下操作符float*()的作用和使用方法吗 我已经搜索过StackOverflow,它看起来像是一个转换操作符,但我仍然不确定它到底做了什么,以及为什么它有用 善意的问候,这是一个转换运算符,允许类与需要浮点*的API一起使用。您有两个不同的版本,因为一个将类转换为常量浮点*,另一个将类转换为非常量。非常量转换运算符破坏了类的封装 有用性:正如我提到的,当您想要使用一个需要某种类型的库时,它会非常方便。当两种类型之间存在自然转换时,它也很有用。运算符类型\u name声明隐式转换

请有人解释一下操作符float*()的作用和使用方法吗

我已经搜索过StackOverflow,它看起来像是一个转换操作符,但我仍然不确定它到底做了什么,以及为什么它有用


善意的问候,

这是一个转换运算符,允许类与需要
浮点*
的API一起使用。您有两个不同的版本,因为一个将类转换为
常量浮点*
,另一个将类转换为非
常量
。非常量转换运算符破坏了类的封装

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

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

Vector x(1, 2, 3);
float* f = x;
assert(*f == 1);
不用说,这种特殊的转换非常糟糕,因为它的效果非常不直观,很容易导致找不到bug。隐式转换通常应该小心处理,因为它们隐藏了潜在的混淆语义。但是它们可以用于伟大的类型,这些类型应该可以互换使用,并且转换不会造成伤害


例如,考虑编写自己的<代码>整数< /代码>和<代码>复合体< /代码>类的情况。从

整数
复数
的转换是无害的,因为每个整数都是有效复数(但反之亦然)。所以有一个隐式转换
整数
complex
是安全的。

正如所说,它是一种转换运算符,用于将
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;
}
#包括
#包括
类向量
{
公众:
浮动x,y,z;
向量():x(0),y(0),z(0){
}
向量(浮点x,浮点y,浮点z):x(x),y(y),z(z){
}
运算符浮点*(){
return&x;
}
运算符常量浮点*()常量{
return&x;
}
};
int main()
{
向量v(1,3,2);
自动最大=标准::最大元素(v+0,v+3);

std::cout附议它是可怕的。更安全的选择是:float&operator[](int n){return(&x)[n];}@MattMcNabb,假设这是类的整个定义(或者至少它没有虚拟成员和基类),那么它们实际上保证是连续的,并且按照声明的顺序,因为这是一个标准布局结构。@Matt McNabb数据成员的顺序是有保证的。@Angew和Vlad-你说得很对;虽然这个类是非POD的,但它仍然是由
[class]指定的标准布局#7
到目前为止,两个答案都没有解释为什么它转换为
float*
而不是
float
。非常量可能是故意想要破坏封装,但为什么有人会编写
const float*
转换???->啊哈,刚才看到Matt关于假设x,y,z在mem中是连续的观点ory.好的,可疑的设计,但我现在明白了:-)@Darren我不会尝试解释它,因为我无法解释。这只是一个坏主意。我怀疑原作者想为向量公开一个类似数组的接口,但这是一个坏主意,因为我的回答(以及更多)下面的评论中提到了原因@Angew谢谢你的指点:)很明显,我知道,因为我指出了破损的封装,但我的回答不清楚。我已经更新了它。
#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;
}