重载c++运算符int/foat(.)

Overloading c++ operators int/float(..)

本文关键字:foat int c++ 运算符 重载      更新时间:2023-10-16

我现在正在C++中研究运算符,但我有一个问题。我试图重载int/foat运算符,我在类中有两个变量

class Zespolona{
public:
    float re;
    float im;
}

我做过所有的操作员,但当我做时

operator int const(){
        this->re = (int)this->re;
        this->im = (int)this->im;
        return *this;
    }

然后它得到一个无限循环。

我的主要

int main(){
    Zespolona z1;
    z1.re = 1.2;
    z1.im = 34.9;
    z1 = (int)z1;
    cout << z1 << endl;
}

我能做什么,得到其中两个变量的int?

我不完全确定你想要实现什么。我猜测以下两种可能性之一:

1) 将类的两个浮点(reim)转换为整数:这很简单。由于这两个成员是公开的,您可以直接访问它们:

#include <iostream>
int main()
{
    Zespolona Z1;
    Z1.re = 1.2;
    Z1.im = 34.9;
    std::cout << "Re: " << (int) Z1.re << std::endl;
    std::cout << "Im: " << (int) Z1.im << std::endl;
    return 0;
}

该程序的输出应为:

Re: 1
Im: 34

注意:当您将浮点转换为整数时,小数点之后的所有内容都会被省略(至少这是Ubuntu下使用g++的行为)。

如果您希望这两个浮点是私有的或受保护的,则必须创建类似int GetRe()int GetIm()的方法。

2) 使用整数转换运算符operator int const()将类的两个浮点值(reim)转换为一个整数。此运算符必须返回一个int。对于以下示例,我决定返回复数的绝对值(幅度)(由于您的成员被称为re和im,我猜该类用于复数):

class Zespolona
{
     public:
         float re;
         float im;
         operator int const()
         {
              return (int) sqrt(re*re + im*im);
         }
};
int main()
{
    Zespolona Z1;
    Z1.re = 1.2;
    Z1.im = 34.9;
    std::cout << "Z1: " << (int) Z1 << std::endl;
    return 0;
}

现在的输出应该是:

 Z1: 34

注意:再次将正确的(浮点)结果34.92…转换为整数34。

当您尝试将问题中提到的代码转换为int时,它会返回对类Zespolona的引用。因此,编译器再次尝试将该引用转换为int。但它得到的只是对Zespolona的引用,依此类推。因此,你得到了一个无限循环。