#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;
}