运算符重载
2015-10-16 11:23
357 查看
#include<iostream> using namespace std; class Complex1 { public: Complex1(){real=0;imag=0;} Complex1(double x,double y){real=x;imag=y;} Complex1 complex_add(Complex1 &d);//普通方法实现加法 void print(){cout<<"("<<real<<","<<imag<<"i)\n";} private: double real; double imag; }; Complex1 Complex1::complex_add(Complex1 &d) { Complex1 c; c.real=real+d.real; c.imag=imag+d.imag; return c; } class Complex2 { public: Complex2(){real=0;imag=0;} Complex2(double x,double y){real=x;imag=y;} Complex2 operator+(Complex2 &d);//操作符重载实现加法 void print(){cout<<"("<<real<<","<<imag<<"i)\n";} friend std::ostream& operator<<(std::ostream &os,Complex2 &d);//操作符<<的重载。。效果类似于print() private: double real; double imag; }; //C++不允许用户自己定义新的运算符,只能对已有的运算符进行重载 //.(成员访问运算符)*(成员指针访问运算符)::(域运算符)sizeof(尺寸运算符)?:(条件运算符)不允许进行重载 //重载不能改变运算符操作数的个数;不能改变运算符的优先级别;不能有默认的参数 //重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应该有一个是类对象或类对象的引用(防止用户修改用于标准类型结构的运算符性质) Complex2 Complex2::operator+(Complex2 &d) { Complex2 c; c.real=real+d.real; c.imag=imag+d.imag; return c; // return Complex2(real+d.real,imag+d.imag); // return Complex2(this->real+d.real,this->imag+d.imag); } //operator<<()函数的原型是:std::ostram& operator<<(std::ostream& os,Rational f); //第一个参数os是将要向它写数据的那个输出流;第二个参数f是打算写到输出流os里的数据值 //即将f写入os中 std::ostream& operator<<(std::ostream &os,Complex2 &d) { os<<"("<<d.real<<","<<d.imag<<"i)"<<endl; return os; } class Complex3 { public: Complex3(){real=0;imag=0;} Complex3(double x,double y){real=x;imag=y;} friend Complex3 operator+(Complex3 &c,Complex3 &d); void print(){cout<<"("<<real<<","<<imag<<"i)\n";} private: double real; double imag; }; //注意,这里作为友元函数,不属于Complex类,不要写:: Complex3 operator+(Complex3 &c,Complex3 &d)//友元函数,该函数不属于该类,但可以访问类的private、protected、public,即可以访问到c.real { return Complex3(c.real+d.real,c.imag+d.imag); } void main() { Complex1 c1(3,4),c2(5,-10),c3; cout<<"使用普通方法实现加法:"<<endl; c3=c1.complex_add(c2); cout<<"c1=";c1.print();cout<<"c2=";c2.print();cout<<"c1+c2=";c3.print();//private成员不能通过类对象调用,只能通过成员函数print()调用 cout<<endl<<endl; Complex2 c4(3,4),c5(5,-10),c6; cout<<"使用运算符重载实现加法:"<<endl; c6=c4+c5; cout<<"c4=";c4.print();cout<<"c5=";c5.print();cout<<"c4+c5=";c6.print(); cout<<"使用操作符<<重载后c4+c5="<<c6;//操作符<<的重载 cout<<endl<<endl; Complex3 c7(3,4),c8(5,-10),c9; cout<<"使用友元函数实现加法:"<<endl; c9=c7+c8; cout<<"c7=";c7.print();cout<<"c8=";c8.print();cout<<"c7+c8=";c9.print(); cout<<endl<<endl; }
相关文章推荐
- android:layout_weight的真实含义
- <LeetCode><Easy> 190 Revese Bits
- JAVA权限修饰符(public/protected/private)
- 【ShancoLove】带你看数据结构——第七课:树的基本概念
- 为移动而设计:交互设计篇
- mysql set赋值与select into 赋值的区别
- 浮点数不用科学计数法
- 【LoadRunner】安装LoadRunner时提示缺少vc2005_sp1_with_atl_fix_redist解决方案
- LeetCode "Flip Game II"
- MonthCalendar控件
- Unified Occlusion Culling: Portals, Visibility Umbra, and HZB
- Android属性动画之XML定义方式
- 剑指offer第十四题【链表中倒数第k个结点】c++实现
- JAVA配置文件取值方法
- SQLServer之创建表格,向表格中插入数据
- Spring Maven POM.xml
- sublime Emmet的用法及相关语法
- 常用英文单词标准缩写
- fix bug滑动视图 动画卡ui
- Linux下Tomcat的启动、关闭、杀死进程