本文主要是介绍第6周项目6--复数模板类-友元,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
/*
* 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)i
Complex<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;
}
这篇关于第6周项目6--复数模板类-友元的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!