第6周项目6--复数模板类-友元

来源:互联网 发布:电商商品推荐算法 编辑:程序博客网 时间:2024/05/16 23:51
/* * Copyright (c) 2015, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作    者:姜甜甜 * 完成日期:2015年 4 月 14日 * 版 本 号:v1.0 * * 可以通过模板类的技术手段,设计Complex,使实部和虚部的类型为定义对象时指定的实际类型。    (1)要求类成员函数在类外定义。    (2)在此基础上,再实现减法、乘法和除法 */
#include <iostream>using namespace std;template<class T> //数据类型class Complex{public:    Complex(T x,T y):a(x),b(y) {}    Complex()    {        a=0;        b=0;    }    void display();    Complex<T>complex_add(Complex <T> &t);    Complex<T>complex_minus(Complex <T> &t);    Complex<T>complex_multiply(Complex <T> &t);    Complex<T>complex_divide(Complex <T> &t);private:    T a;    T b;};template <class T>void Complex<T>::display(){    cout<<a;    if(b>=0)        cout<<"+";    cout<<b<<"i"<<endl;}template <class T>Complex<T> Complex<T>::complex_add(Complex <T> &t){    Complex <T>f;    f.a=a+t.a;    f.b=b+t.b;    return f;}template <class T>Complex<T> Complex<T>::complex_minus(Complex <T> &t){    Complex <T>f;    f.a=a-t.a;    f.b=b-t.b;    return f;}template <class T>Complex<T> Complex<T>::complex_multiply(Complex <T> &t){    Complex <T>f;    f.a=a*t.a-b*t.b;    f.b=a*t.b+b*t.a;    return f;}template <class T>  //复数相除:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +(bc-ad)/(c^2+d^2)iComplex<T> Complex<T>::complex_divide(Complex <T> &t){    Complex <T>f;    f.a=(a*t.a+b*t.b)/((t.a*t.a)+(t.b*t.b));    f.b=(b*t.a-a*t.b)/((t.a*t.a)+(t.b*t.b));    return f;}int main( ){    Complex<int> c1(3,4),c2(5,-10),c3;   //实部和虚部是int型    c3=c1.complex_add(c2);    cout<<"c1+c2=";    c3.display( );    Complex<double> c4(3.1,4.4),c5(5.34,-10.21),c6; //实部和虚部是double型    c6=c4.complex_add(c5);    cout<<"c4+c5=";    c6.display( );   c3=c1.complex_minus(c2);   cout<<"c1-c2=";   c3.display();   c3=c1.complex_multiply(c2);   cout<<"c1*c2=";   c3.display();   c3=c1.complex_divide(c2);   cout<<"c1/c2=";   c3.display();    return 0;}


增加友元函数的使用

#include <iostream>using namespace std;template<class T> //<span style="color:#ff0000;">类声明前加模板的声明  </span> class Complex{public:    Complex(T x,T y):a(x),b(y) {}  <span style="color:#ff0000;">//类声明中的每一个T,将被对象定义时提供的实际类型代替 </span>      Complex()    {        a=0;        b=0;    }    void display();    Complex complex_add(Complex &t);    template<class T1>  <span style="color:#990000;"> //要重新定义</span>    friend Complex <T1>add_complex(Complex <T1> &,Complex <T1> &);private:    T a;    T b;};template <class T>  <span style="color:#cc0000;">//每一个成员函数的定义前,必须要声明类模板 </span>void Complex<T>::display()   <span style="color:#cc0000;">//使用了模板的类,将不再独立使用,其类名的完整表示为“类模板名<虚拟类型参数>”   </span>{    cout<<a;    if(b>=0)        cout<<"+";    cout<<b<<"i"<<endl;}template <class T>Complex<T> Complex<T>::complex_add(Complex <T> &t){    Complex <T>f;    f.a=a+t.a;    f.b=b+t.b;    return f;}template <class T1>Complex<T1> add_complex(Complex<T1> &t1,Complex<T1> &t2){    Complex<T1> f;    f.a=t1.a+t2.a;    f.b=t1.b+t2.b;    return f;}int main( ){    Complex<int> c1(3,4),c2(5,-10),c3;    c3=c1.complex_add(c2);  //调用成员函数支持加法运算,有一个形参    cout<<"c1+c2=";    c3.display( );    Complex<double> c4(3.1,4.4),c5(5.34,-10.21),c6;    c6=c4.complex_add(c5);  //调用成员函数支持加法运算,有一个形参    cout<<"c4+c5=";    c6.display( );    Complex<int> c7;    c7=add_complex(c1,c2);  //调用友员函数支持加法运算,有两个形参    cout<<"c1+c2=";    c7.display( );    Complex<double> c8;    c8=add_complex(c4,c5);  //调用友员函数支持加法运算,有两个形参    cout<<"c4+c5=";    c8.display( );    return 0;}



 

0 0
原创粉丝点击