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,它看起来像是一个转换运算符,但我仍然不确定它实际上是做什么以及为什么它有用.
亲切的问候,
operator type_name声明一个隐式转换运算符.换句话说,当您尝试(隐式)将类型的对象转换为float* - 例如在赋值中时,将调用此函数:
Vector x(1, 2, 3);
float* f = x;
assert(*f == 1);
Run Code Online (Sandbox Code Playgroud)
毋庸置疑,这种特殊的转换非常糟糕,因为它的效果非常不直观,很容易导致无法找到错误.隐式转换通常应谨慎处理,因为它们隐藏了可能令人困惑的语义.但它们可以用于那些应该可以互换使用的类型,并且转换不会受到伤害.
例如,考虑您编写自己的类integer和complex类的情况.从A变换integer到complex是无害的,因为每一个整数是一个有效的复合物(但不是反之亦然).所以进行隐式转换integer→ 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;
}
Run Code Online (Sandbox Code Playgroud)
输出为3.
考虑到根据C++标准
13分配具有相同访问控制(第11章)的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址
因此定义了类的数据成员的顺序.