c++学习笔记--由复数类看运算符重载

#include<iostream>
#include<iomanip>

using namespace std;

class Complex;//前置声明 在一个需要声明未定义完成的类,比如 Complex 还未定义 之前要声明有这个类

/*Complex operator+(const Complex& c2,const Complex& c1);
Complex operator+(const int a,const Complex& c1);
*/
ostream operator<<(ostream& out,const Complex& c);//重定向的重载 返回值是一个ostream类的一个对象 这样可以连续输出cout<<c1<<c2<<endl;如果返回值是void连续输出会报错

class Complex
{
	//friend Complex operator+(const Complex& c2,const Complex &c1); 这也是运算符重载的一种方法 
	//friend Complex operator+(const int a,const Complex& c1);
	//friend Complex Add(const int a,const Complex &c1);优点是第一个加的值不必是该类,缺点是调用时简约 如可以1+c2;
	//friend Complex Add(const Complex& c2,const Complex &c1);优点是第一个加的值不必是该类,缺点是调用时简约 要c=Add(c1,c2);
	
public:
	Complex(double r=0, double i=0) :real(r), imag(i){}
	~Complex(){}
	Complex operator+(const Complex& c1)const;//虽然调用方法节俭,但有要求,必须操作符前是这个重载方法的类的一个对象 不能是 1+c1 如果要实数加复数必须用友元这种方法
	Complex operator-(const Complex& c1)const;//减号
	Complex operator-();//负号
	Complex operator++();//++c1//因为要改变执行者的值 那么这里就不要用常函数
	Complex operator++(int);//c1++
	bool operator==(const Complex& c1)const;
	friend ostream operator<<(ostream& out, const Complex& c);
private:
	double real;
	double imag;
};

//事实上 c1+c2 等价于 c1.operator(c2);
Complex Complex::operator+(const Complex& c1)const
{
	Complex temp;
	temp.real = real + c1.real;
	temp.imag = imag + c1.imag;
	return temp;
	//return Complex(real+c1.real,imag+c1.imag)   这种写法也很好
}
Complex Complex::operator-(const Complex& c1)const
{
	Complex temp;
	temp.real = real - c1.real;
	temp.imag = imag - c1.imag;
	return temp;
}
Complex Complex::operator-()
{
	return Complex(-real, -imag);
}
Complex Complex::operator++()
{
	++real;
	++imag;
	return Complex(real, imag);
}
Complex Complex::operator++(int)
{
	Complex temp(*this);//先取出值 作为临时的值 给temp 再自增 传回去的是 temp;也就是原来没自增前的值 
	real++;
	imag++;
	return temp;
}
bool Complex::operator==(const Complex& c1)const
{
	return real == c1.real&&imag == c1.imag;
}
ostream operator<<(ostream& out, const Complex& c)
{
	out <<"实部 "<<c.real<< " 虚部 "<<c.imag<<"i";
	return out;
}

int main()
{
	Complex c1(1, 2), c2(3, 4), c;
	c = c1 + c2;//这里的等号默认用了浅复制,默认左边的值与右边的值一模一样
	cout<< c1 << endl;
	cout<< c2 << endl;
	cout<< c << endl;
	cout<<c1-c2<<endl;
	cout<<-c<<endl;
	cout<<"c1 c2 是否相等:"<<(c1==c2)<<endl;
	cout<<++c<<endl;
	cout<<c++<<endl;
	return 0;
}

3.28 更新:

#include<iostream>
#include<iomanip>

using namespace std;

class Complex;//前置声明 在一个需要声明未定义完成的类,比如 Complex 还未定义 之前要声明有这个类

/*Complex operator+(const Complex& c2,const Complex& c1);
Complex operator+(const int a,const Complex& c1);
*/
ostream operator<<(ostream& out,const Complex& c);//重定向的重载 返回值是一个ostream类的一个对象 这样可以连续输出cout<<c1<<c2<<endl;如果返回值是void连续输出会报错
Complex Add(const int a,const Complex &c1);
Complex Jian(const int a,const Complex &c1);
Complex Chen(const int a,const Complex &c1);
Complex Chu(const int a,const Complex &c1);
class Complex
{
	//friend Complex operator+(const Complex& c2,const Complex &c1); 这也是运算符重载的一种方法 
	//friend Complex operator+(const int a,const Complex& c1);
	//friend Complex Add(const int a,const Complex &c1);优点是第一个加的值不必是该类,缺点是调用时简约 如可以1+c2;
	//friend Complex Add(const Complex& c2,const Complex &c1);优点是第一个加的值不必是该类,缺点是调用时简约 要c=Add(c1,c2);
	friend Complex Add(const int a,const Complex &c1);
	friend Complex Jian(const int a,const Complex &c1);
	friend Complex Chen(const int a,const Complex &c1);
	friend Complex Chu(const int a,const Complex &c1);
public:
	Complex(double r=0, double i=0) :real(r), imag(i){}
	~Complex(){}
	Complex operator+(const Complex& c1)const;//虽然调用方法节俭,但有要求,必须操作符前是这个重载方法的类的一个对象 不能是 1+c1 如果要实数加复数必须用友元这种方法
	Complex operator-(const Complex& c1)const;//减号
	Complex operator*(const Complex& c1)const;//号
	Complex operator/(const Complex& c1)const;
	Complex operator-();//负号
	Complex operator++();//++c1//因为要改变执行者的值 那么这里就不要用常函数
	Complex operator++(int);//c1++
	bool operator==(const Complex& c1)const;
	bool operator!=(const Complex& c1)const;
	bool operator>(const Complex& c1)const;
	bool operator<(const Complex& c1)const;
	friend ostream operator<<(ostream& out, const Complex& c);
private:
	double real;
	double imag;
};

//事实上 c1+c2 等价于 c1.operator(c2);
Complex Complex::operator+(const Complex& c1)const
{
	Complex temp;
	temp.real = real + c1.real;
	temp.imag = imag + c1.imag;
	return temp;
	//return Complex(real+c1.real,imag+c1.imag)   这种写法也很好
}
Complex Complex::operator-(const Complex& c1)const
{
	Complex temp;
	temp.real = real - c1.real;
	temp.imag = imag - c1.imag;
	return temp;
}
Complex Complex:: operator*(const Complex& c1)const{
	Complex temp;
	temp.real = real * c1.real;
	temp.imag = imag * c1.imag;
	return temp;
}
Complex Complex:: operator/(const Complex& c1)const
{
	Complex temp;
	temp.real = real / c1.real;
	temp.imag = imag / c1.imag;
	return temp;
}
Complex Add(const int a,const Complex &c1)
{
	Complex temp;
	temp.real = a + c1.real;
	temp.imag = c1.imag;
	return temp;
}
Complex Jian(const int a,const Complex &c1)
{
	Complex temp;
	temp.real = c1.real - a;
	temp.imag = c1.imag;
	return temp;
}
Complex Chen(const int a,const Complex &c1)
{
	Complex temp;
	temp.real = c1.real * a;
	temp.imag = c1.imag;
	return temp;
}
Complex Chu(const int a,const Complex &c1)
{
	Complex temp;
	temp.real = c1.real / a;
	temp.imag = c1.imag;
	return temp;
}

Complex Complex::operator-()
{
	return Complex(-real, -imag);
}
Complex Complex::operator++()
{
	++real;
	++imag;
	return Complex(real, imag);
}
Complex Complex::operator++(int)
{
	Complex temp(*this);//先取出值 作为临时的值 给temp 再自增 传回去的是 temp;也就是原来没自增前的值 
	real++;
	imag++;
	return temp;
}
bool Complex::operator==(const Complex& c1)const
{
	return real == c1.real&&imag == c1.imag;
}
bool Complex::operator!=(const Complex& c1)const
{
	return real != c1.real && imag != c1.imag;
}
bool Complex::operator>(const Complex& c1)const
{
	return real > c1.real && imag > c1.imag;
}
bool Complex:: operator<(const Complex& c1)const
{
	return real < c1.real && imag <c1.imag;
}
ostream operator<<(ostream& out, const Complex& c)
{
	out <<"实部 "<<c.real<< " 虚部 "<<c.imag<<"i";
	return out;
}

int main()
{
	Complex c1(1, 2), c2(3, 4), c,c3(2,2),c4(3,3),c5(1,1);
	int a = 2;
	cout<<"a+c1:"<<endl;
	cout<<Add(a,c1)<<endl;
	cout<<"c1-a:"<<endl;
	cout<<Jian(a,c1)<<endl;
	cout<<"c1*a:"<<endl;
	cout<<Chen(a,c1)<<endl;
	cout<<"c1/a:"<<endl;
	cout<<Chu(a,c1)<<endl;
	c = c1 + c2;//这里的等号默认用了浅复制,默认左边的值与右边的值一模一样
	cout<<"c1:"<<endl;
	cout<< c1 << endl;
	cout<<"c2:"<<endl;
	cout<< c2 << endl;
	cout<<"c:"<<endl;
	cout<< c << endl;
	cout<<"c1-c2:"<<endl;
	cout<<c1-c2<<endl;
	cout<<"c1*c2:"<<endl;
	cout<<c1*c2<<endl;
	cout<<"c1/c2:"<<endl;
	cout<<c1/c2<<endl;
	cout<<"-c:"<<endl;
	cout<<-c<<endl;
	cout<<"c1 c2 是否相等:"<<(c1==c2)<<endl;
	cout<<"c4>c3:"<<(c4 > c3)<<endl;
	cout<<"c5<c3的关系:"<<(c5 < c3)<<endl;
	cout<<"c1 c5 不相等"<<(c1!=c5)<<endl;
	cout<<"++前置:"<<endl;
	cout<<++c<<endl;
	cout<<"++后置:"<<endl;
	cout<<c++<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值