重载运算符*c++
overloading operator * c++
我一直在尝试编译这个程序,但它给了我一个关于重载其中一个函数的*运算符的错误:复杂运算符*(双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
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 如何防止clang格式在流运算符调用之间添加换行符<<