我一直在查看源代码,试图了解有关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,它看起来像是一个转换操作符,但我仍然不确定它实际上是做什么以及为什么它有用。
亲切的问候,
答案 0 :(得分:8)
operator type_name
声明隐式转换运算符。换句话说,当您尝试(隐式)将类型的对象转换为float*
时,将调用此函数 - 例如在赋值中:
Vector x(1, 2, 3);
float* f = x;
assert(*f == 1);
毋庸置疑,这种特殊的转换非常糟糕,因为它的效果非常不直观,很容易导致无法找到错误。隐式转换通常应谨慎处理,因为它们隐藏了可能令人困惑的语义。但是它们可以用于那些应该互换使用的类型,并且转换不会受到伤害。
例如,考虑您编写自己的integer
和complex
类的情况。从integer
到complex
的转换是无害的,因为每个整数都是有效的复数(但不是反之亦然)。因此,隐式转化integer
→complex
是安全的。
答案 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转换运算符会破坏类的封装。
有用性:正如我所提到的,当你想要一个需要特定类型的库时,它可以非常方便。当两种类型之间存在自然转换时,它也很有用。