繁体   English   中英

运算符将%重载为复数模

[英]Operator overloading % into the modulus of complex number

我正在尝试对一个复杂的数字进行运算符重载,我实现了一个包含实部和虚部的类。 我正在尝试在%运算符上重载它返回模数值(实数和虚数的长度),但是我收到错误消息“必须正好接受一个参数”,我在做什么错?

这是我的头文件

complex.h

class complex{
     private:
          double rm;
          double im;
     public:
          void operator % ();

complex.cpp

void operator %(){
      complex c;
      c.re = pow(re,2);
      c.im = pow(im,2);
      return c;

谢谢!

C ++中的'%'运算符是二进制运算符,类似于a % b ,但是您试图像一元运算符一样使用它。 C ++允许您重载现有运算符的实现,但不能添加新运算符或更改使用现有运算符的方式。

operator%是二进制运算符(某些运算符(如operator-可以是一元或二进制))。

这意味着您可以用两种不同的方式定义它。

  1. 作为独立功能

    complex operator%(const complex& left, const complex& right);

  2. 作为类成员函数,在这种情况下,“ left”一词暗含

    complex& complex::operator%(const complex& right);

我发现您的代码还有其他问题。 一般在C ++ %表示模数或余数。 对于复数,模是以abs为单位的范数 ,它返回实数。 我想这是为了使情况更清楚,特别是当存在混合了实数和实数的表达式时。 在模运算符中,您只需要对实部和虚部进行平方。 我不知道这是什么意思。

如前所述, %运算符是二进制运算符,因此不可能将其用作一元模数。

话虽如此,我们可以滥用自由函数二进制运算符来提供语法糖。

注意此答案是出于娱乐目的和本着学习的精神。 这不是编码风格的建议。

#include <cmath>

struct imperative_mode_sentinel {};

struct complex
{
    complex(double rm, double im) : rm(rm), im(im) {}
    double rm, im;

    complex modulus() const
    {
        return complex(std::pow(rm, 2), std::pow(im, 2));
    }
};

auto operator%(imperative_mode_sentinel, complex const& r) -> complex
{
    return r.modulus();
}


constexpr static auto imperative_mode = imperative_mode_sentinel();

int main()
{
    auto c = complex(1,1);

    auto d = imperative_mode %c; // equivalent to d = c.modulus()
}

如果这是您的模数运算符,那很好。 您可以根据需要赋予它任何含义。 ;

除了上述限制之外,该语言对重载运算符的操作或返回类型(返回类型(不参与重载解析))没有任何其他限制,但是通常,重载运算符的行为应尽可能与重载运算符相似。内置运算符

class complex{
    private:
      double rm;
      double im;
    public :
          complex(int i, int r) {
              re = r; im = i;
          }
          complex operator%(const complex& mc){//for complex

                return complex(pow(re,2),pow(im,2)) ;
          }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM