首页 > C++ > 正文 普通类 浏览 1320 · 点赞 0 · 1年前 (2023-10-12) C++普通类 x1#ifndef _COMPLEX_2#define _COMPLEX_//防卫式声明3//一个类尽量做到以下5点:4 //1、数据在private5 //2、参数尽量用pass by reference,6 //3、返回值也尽量用 return by reference,返回的是局部变量则不行7 //4、如果不改变参数,则加const8 //5、构造函数用初始化列表,而不在函数体内用赋值操作9 10#include <cmath>11//template <typename T>//模板,成员函数声明和定义的参数列和返回列中,只要是有类名的地方都要加上<T>12class complex13{14private:15 /* data */16 double re,im;17 friend complex& _doapl(complex*,const complex&);18public:19 complex(/* args */double r = 0,double i = 0)20 :re(r),im(i)21 {}//函数若是在类内定义完成,便自动成为inline候选人,是不真的变成inline由编译器自己决定22 complex& operator += (const complex&);//最好所有参数都传引用,在底层相当于传指针,即地址只有4个字节,比起传值速度会快,因传值会有构造和析构过程23 //如果又不希望函数改这个参数,则加个const24 double real() const {return re;}25 double imag() const {return im;}26 int func(const complex& param)27 {28 return param.re + param.im;//这里直接访问了re和im,说明相同class的各个object互为友元29 }30 ~complex();//一般的,如果类内不含有指针,可以不写析构函数,编译器会有默认的析构函数31};32 33inline complex&34_doapl(complex* ths,const complex& r)//友元自由取得friend的private成员35{36 ths->re += r.re;37 ths->im += r.im;38 return *ths;//return by reference语法分析,传递者无需知道接收者是以reference 形式接收39 //这儿传递者是传的一个complex类的值,但是因return by reference ,所以返回的是ths地址内的值40}41 42complex::~complex()//一般的,如果类内不含有指针,可以不写析构函数,编译器会有默认的析构函数43{44 45}46//操作符重载47//c2 += c1; +=操作符的左边有没有定义+=函数,它的右边会被传到+=操作符的函数参数里去48complex& complex::operator += (const complex& rhs)49{50 return _doapl(this,rhs);51}52 53inline double//建议编译器把它作为内联函数,实际作不作只有编译器知道54imag (const complex& x)55{56 return x.imag ();57}58 59inline double60real (const complex& x)61{62 return x.real ();63}64 65//任何一种操作符都可以有两种想法,可以是写成成员函数,也可以写成全局函数66//为了对付client的三种可能用法,这儿对应开发三个函数67//操作符载,非成员函数,无this68//下面这三个函数绝不可return by reference,因为,它们返回的必定是个local object69//返回语句中是用的,typename+小括号,编译器会建一个临时对象,到下一行生命周期结束70 71inline complex72operator + (const complex& x,const complex& y)73{74 return complex (real(x) + real(y),75 imag(x) + imag(y));76}77 78inline complex79operator + (const complex& x,double y)80{81 return complex (real(x) + y,imag(x));82}83 84inline complex85operator + (double x,const complex& y)86{87 return complex (x + real(y),imag(y));88}89//再加正,负号操作符重载90 91inline complex//这儿因为返回的不是局部变量,所以也可以用inline complex<T>&92operator + (const complex& x)93{94 return x;95}96inline complex97operator - (const complex& x)98{99 return complex (-real(x),-imag(x));100}101//比较复数等不等102 103inline bool104operator == (const complex& x,const complex& y)105{106 return real(x)==real(y) && imag(x)==imag(y);107}108//共轭复数:实部相等,虚部取反109 110inline complex111conj (const complex& x)112{113 return complex (real(x),-imag(x));114}115//输出操作符重载,这个不可以是成员函数,则使用时只能写成c1<<cout,和习惯用法相反116#include <iostream>117using namespace std;118ostream&//返回ostream&的目的,是为了用户可以连续输出,比如:cout<<c1<<c2<<endl;119 //如果不考虑连续输出,这个函数就可以不要返回值。120operator <<(ostream& os,const complex& x)//这儿前一个参数不能加const,因为return中相当于改了os的状态121{122 return os <<'('<<real(x)<<','<<imag(x)<<')';123}124#endif125 126 C++ 已有0人点赞 打赏一下作者 上一篇 类使用空间说明 下一篇 含指针的类 猜你喜欢 含指针的类 类使用空间说明 构造函数