重载运算符*c++

overloading operator * c++

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

我一直在尝试编译这个程序,但它给了我一个关于重载其中一个函数的*运算符的错误:复杂运算符*(双n)const

当我尝试编译时,我得到了错误:在'2*c'中没有匹配的'operator*'

这是头文件:

复杂.h

#ifndef COMPLEX0_H
#define COMPLEX0_H
class complex {
    double realNum;
    double imagNum;
public:
    complex();
    complex(double x,double y);
    complex operator *(double n)const;
    complex operator *(const complex &c1)const;
   friend std::istream &operator>>(std::istream &is,complex &cm);
   friend std::ostream &operator<<(std::ostream &os,const complex &cm);
};
#endif

这是cpp:

复杂.cpp

 #include "iostream"
#include "complex0.h"
complex::complex() {
    imagNum = 0.0;
    realNum = 0.0;
}
complex::complex(double x, double y) {
    realNum = x;
    imagNum = y;
}
complex complex::operator *(const complex& c1) const{
complex sum;
sum.realNum=realNum*c1.realNum-c1.imagNum*imagNum;
sum.imagNum=realNum*c1.imagNum+imagNum*c1.realNum;
    return sum;
}
complex complex::operator *(double n)const{ 
    complex sum;
    sum.realNum=realNum*n;
    sum.imagNum=imagNum*n;
    return sum;
}
std::istream &operator >>(std::istream& is, complex& cm) {
    is >> cm.realNum>> cm.imagNum;
    return is;
}
std::ostream &operator <<(std::ostream& os, const complex& cm){
os<<"("<<cm.realNum<<","<<cm.imagNum<<"i)"<<"n";    
return os;
}

main.cpp

#include <iostream>
using namespace std;
#include "complex0.h" 
    int main() {
        complex a(3.0, 4.0); 
        complex c;
        cout << "Enter a complex number (q to quit):n";
        while (cin >> c) {
            cout << "c is " << c << "n";
            cout << "a is " << a << "n";
            cout << "a * c" << a * c << "n";
            cout << "2 * c" << 2 * c << "n";
            cout << "Enter a complex number (q to quit):n";
        }
        cout << "Done!n";
        return 0;
    }

有人能向我解释一下我做错了什么吗?

只有当第一个操作数属于您的类类型时,成员函数运算符才适用。如果你想处理第二个操作数属于你的类型的情况,你还需要一个自由函数(在这个函数中,我们只是通过运算的交换性将其委托给成员函数):

complex operator*(double n, complex const & x)
{
    return x * n;
}

(请注意,标准库已包含<complex>。)

您有一个定义如下的成员函数:

complex complex::operator *(double n) const;

这将允许您执行以下操作:complex_number * 3.0,但不能执行3.0 * complex_number。但是,您不能创建一个成员函数来执行3.0 * complex_number。唯一可以创建该成员函数的地方是在double的定义内,不能更改该定义。

不过,您也可以将其作为独立函数来执行,而不是作为成员函数来执行:

complex operator*(complex x, double n); // Called for complex_number * 2.0
complex operator*(double n, complex x); // Called for 2.0 * complex_number