第九周任务一:定义Complex类中的<<和>>运算符的重载

本文介绍了一个使用C++实现的复数类Complex,并重载了输入输出流运算符,以便于复数对象的输入与显示。此外,还实现了基本的算术运算如加、减、乘、除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* (程序头部注释开始)    
* 程序的版权和版本声明部分    
* Copyright (c) 2011, 烟台大学计算机学院学生     
* All rights reserved.    
* 作    者:       田庆                           
* 完成日期:  2012     年   4    月   16  日    
* 版 本 号:              
    
* 对任务及求解方法的描述部分    
* 输入描述:     
* 问题描述:  定义Complex类中的<<和>>运算符的重载,实现输入和输出,
* 程序输出:     
* 程序头部的注释结束    
*/  
#include<iostream>
using namespace std;
class Complex
{
public:

	Complex(){real=0;imag=0;}
	Complex(double r,double i){real=r;imag=i;}
	Complex operator+(Complex &c2);
	Complex operator-(Complex &c2);
	Complex operator*(Complex &c2);
	Complex operator/(Complex &c2);
	void display();
	//重载流插入运算符“<<”      
	friend ostream& operator << (ostream&,Complex&);    
	//重载流提取运算符“>>”      
	friend istream& operator >> (istream&,Complex&);  
private:
	double real;
	double imag;
};
//用成员函数定义加减乘除
Complex Complex::operator+(Complex &c2)//下面定义成员函数
{
	return(Complex(real+c2.real,imag+c2.imag));
}
Complex Complex::operator-(Complex &c2)
{
	return(Complex(real-c2.real,imag-c2.imag));
}
Complex Complex::operator*(Complex &c2)
{
	Complex c;    
	c.real = real*c2.real - imag*c2.imag;    
	c.imag = real*c2.imag + imag*c2.real;    
	return c;
}
Complex Complex::operator/(Complex &c2)
{    
	Complex c;    
	c.real = (real*c2.real + imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);    
	c.imag = (-real*c2.imag + imag*c2.real)/(c2.real*c2.real+c2.imag*c2.imag);   
	return c;    
} 


void Complex::display()
{    
	cout<<"("<<real<<","<<imag<<"i)"<<endl;    
} 
//下面定义成员函数     
istream& operator >> (istream& input,Complex& c)  
{   
	input>>c.real>>c.imag;  
	return input;  
}  
ostream& operator << (ostream& output,Complex& c)  
{  
	output<<"("<<c.real<<" "<<c.imag<<"i)"<<endl;  
	return output;  
}    
int main()
{
	Complex c1,c2,c3;
	cout<<"请输入复数c1的值:(以2 3的形式输入)";  
	cin>>c1;  
	cout<<"请输入复数c2的值:(以2 3的形式输入)";  
	cin>>c2; 
	cout<<"c1=";
	c1.display();
	cout<<"c2=";
	c2.display();
	c3=c1+c2;
	cout<<"c1+c2=";
	c3.display();
	c3=c1-c2;
	cout<<"c1-c2=";
	c3.display();
	c3=c1*c2;
	cout<<"c1*c2=";
	c3.display();
	c3=c1/c2;
	cout<<"c1/c2=";
	c3.display();
	system("pause");
	return 0;
}


 

小结:输入输出流的重载就多加两行代码。也是重载问题。

a.cpp:9:49: error: non-member function ‘Complex operator-(Complex&)’ cannot have cv-qualifier 9 | friend Complex operator-( Complex &c3 ) const;//重载双目运算符'-' | ^~~~~ a.cpp:25:9: error: no declaration matches ‘Complex Complex::operator-=(Complex&) const’ 25 | Complex Complex::operator-=(Complex &c2)const | ^~~~~~~ a.cpp:8:17: note: candidate is:Complex Complex::operator-=(Complex&)’ 8 | Complex operator-=( Complex &c2 ); //重载双目运算符'-=' | ^~~~~~~~ a.cpp:3:7: note: ‘class Complex’ defined here 3 | class Complex | ^~~~~~~ a.cpp:31:9: error: no declaration matches ‘Complex Complex::operator-(Complex&) const’ 31 | Complex Complex::operator-(Complex &c3)const | ^~~~~~~ a.cpp:31:9: note: no functions named ‘Complex Complex::operator-(Complex&) const’ a.cpp:3:7: note: ‘class Complex’ defined here 3 | class Complex | ^~~~~~~ a.cpp: In function ‘int main()’: a.cpp:44:12: error: no match for ‘operator-’ (operand types are ‘Complex’ and ‘Complex’) 44 | c3 = c1-c2; | ~~^~~ | | | | | Complex | Complex In file included from /usr/include/c++/11/bits/stl_algobase.h:67, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/stl_iterator.h:577:5: note: candidate: ‘template<class _IteratorL, class _IteratorR> constexpr decltype ((__y.base() - __x.base())) std::operator-(const std::reverse_iterator<_IteratorL>&, const std::reverse_iterator<_IteratorR>&)’ 577 | operator-(const reverse_iterator<_IteratorL>& __x, | ^~~~~~~~ /usr/include/c++/11/bits/stl_iterator.h:577:5: note: template argument deduction/substitution failed: a.cpp:44:13: note:Complex’ is not derived from ‘const std::reverse_iterator<_IteratorL>’ 44 | c3 = c1-c2; | ^~ In file included from /usr/include/c++/11/bits/stl_algobase.h:67, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/stl_iterator.h:1693:5: note: candidate: ‘template<class _IteratorL, class _IteratorR> constexpr decltype ((__x.base() - __y.base())) std::operator-(const std::move_iterator<_IteratorL>&, const std::move_iterator<_IteratorR>&)’ 1693 | operator-(const move_iterator<_IteratorL>& __x, | ^~~~~~~~ /usr/include/c++/11/bits/stl_iterator.h:1693:5: note: template argument deduction/substitution failed: a.cpp:44:13: note:Complex’ is not derived from ‘const std::move_iterator<_IteratorL>’ 44 | c3 = c1-c2; | ^~ a.cpp:9:24: note: candidate:Complex operator-(Complex&)’ 9 | friend Complex operator-( Complex &c3 ) const;//重载双目运算符'-' | ^~~~~~~~ a.cpp:9:24: note: candidate expects 1 argument, 2 provided 确
05-07
6-10 运算符重载(复数Complex) 分数 10 作者 刘骥 单位 重庆大学 本题要求定义个复数Complex的声明见给出的代码,请给出的完整实现,并通过测试程序。的声明包括如下内容: 数据成员,复数的实部u虚部v; 对复数实部虚部的访问函数; 构造函数; 加号、减号运算符重载(遵守复数的运算规则); 输入、输出运算符重载的声明: class Complex{ private: double u; double v; public: Complex(double _u=0,double _v=0); Complex operator+(const Complex&b); Complex operator-(const Complex&b); double getU() const; double getV() const; friend ostream&operator<<(ostream&os,const Complex&c); friend istream&operator>>(istream&is,Complex&c); }; 测试程序: class Complex{ private: double u; double v; public: Complex(double _u=0,double _v=0); double getU() const; double getV() const; Complex operator+(const Complex&b); Complex operator-(const Complex&b); friend ostream&operator<<(ostream&os,const Complex&c); friend istream&operator>>(istream&is,Complex&c); }; double Complex::getU() const { return u; } double Complex::getV() const { return v; } /* 请在这里填写答案 */ int main(){ Complex a; cin>>a; cout<<"复数a为:"<<a<<endl; Complex b(3,4); Complex c=a+b; cout<<"复数c为:"<<c<<endl; Complex d=a-b; cout<<"复数d为:"<<d<<endl; return 0; } 测试程序的输入: 10 5 测试程序的输出: 复数a为:u=10,v=5 复数c为:u=13,v=9 复数d为:u=7,v=1 提示 下列代码为实现的骨架代码 Complex::Complex(double _u,double _v){ //代码 } Complex Complex::operator+(const Complex&b){ //代码 } Complex Complex::operator-(const Complex&b){ //代码 } ostream&operator<<(ostream&os,const Complex&c){ //代码 } istream&operator>>(istream&is,Complex&c){ //代码 } 代码长度限制 16 KB 时间限制 400 ms 内存限制
最新发布
06-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值