【瞎学c++(1)】不带指针的class

#ifndef __COMPLEX__
#define __COMPLEX__ //防止二次include,非常必要
#include <iostream>
using namespace std;
//template <typename T>//不用指定数据类型,使用时再指定,非常必要 
class complex{
	private:
		double re,im;
	public:
		/*构造函数:(注意带指针的要有析构函数) 
			1、名称必须和类名相同。
			2、可以拥有参数。
			3、可以有默认参数。
			4、没有返回值类型。
			5、可以写{re=r;im=i;}
			6、正规写法[	: re(r), im(i)    ]这种写法表示初始化,而非赋值 ,效率更高
			7、写法,冒号后跟内容,常见就是初始化
			8、构造函数可以有很多个(重载) ,在编译器中其实不同名 
			9、重载注意不能符合多个调用条件,如一个有默认参数,一个没有任何参数 
		*/	 
		complex (double r=0, double i=0)  : re(r), im(i) { }
		//{re=r;im=i};上面两行相当于本行,但不同 
		
		//const 如果函数不会改变数据,马上加上const 
		double real() const {return re;}
		double imag() const {return im;}
		
		/*参数传递(pass by reference):
			由于pass by value会把整个变量传递
			传递变量有时过大
			因此尽量使用引用传递(甚至所有) 
			指针会改变值,如果不想被改变,注意const!!! 
		*/ 
		complex& operator += (const complex&);
		
		/*返回值传递:
			在允许的情况下用reference返回 
			如果return的对象有生命周期,则不能用ref返回 
		*/
		
	//private的内容可以让friend随便使用,效率高但是影响封装
	//同一个class中的object互为friend 
	friend complex& __doapl(complex*, const complex&);
}; 

//操作符重载:重新定义操作符的功能
//成员函数,所有的成员函数都隐藏了this表示调用者,如c2 += c1; 
//下面的非成员也可以写成成员,注意不同之处 
//不可以写在形参里但是可以在函数里用 
//传递者无需知道接受者用引用接受或者值接受 
inline complex& 
__doapl(complex* ths, const complex& r){
	ths->re += r.re;
	ths->im += r.im;
	return *ths;
}
inline complex& 
complex::operator += (const complex& r){
	return __doapl(this,r);
}

inline double
imag(const complex& x){
	return x.imag();
}
inline double
real(const complex& x){
	return x.real();
}
 
 
//非成员函数,没有this,未在class里出现,全局。 
/*c3=c1+c2;
c3=6+c1;
c3=c2+7;*/
//绝对不能return by reference,因为是local object 
inline complex
operator + (const complex& x,const complex& y){
	return complex (real(x)+real(y),imag(x)+imag(y));
}
//注意:complex()创建了临时对象,相当于int(),无名称,生命周期短 
//cout<<complex(2); 
inline complex
operator + (const complex& x,double y){
	return complex (real(x)+y,imag(x));
}
inline complex
operator + (double x,const complex& y){
	return complex (x+real(y),imag(y));
}
inline complex
operator + (const complex& x){
	return x;
}
inline complex
operator - (const complex& x){
	return complex (-real(x),-imag(x));
}

inline bool
operator == (const complex& x,const complex& y){
	return real(x)==real(y)&&imag(x)==imag(y);
}
inline bool
operator == (const complex& x,double y){
	return real(x)==y&&imag(x)==0;
}
inline bool
operator == (double x,const complex& y){
	return real(y)==x&&imag(y)==0;
}
inline bool
operator != (const complex& x,const complex& y){
	return real(x)!=real(y)||imag(x)!=imag(y);
}
inline bool
operator != (const complex& x,double y){
	return real(x)!=y||imag(x)!=0;
}
inline bool
operator != (double x,const complex& y){
	return real(y)!=x||imag(y)!=0;
}
//如果要cout<<conj(c1);编译器就不认识complex怎么输出 
inline complex
conj (const complex& x){
	return complex(real(x),-imag(x));
}

//添加新的输出方式,重载让<<认识complex 
//os不能const,因为他一直在变化 
//注意ostream需要std,返回值最好别void防止cout<<c1<<c2; 
ostream&
operator << (ostream& os,const complex& x){
	return os << '(' << real(x) << ','
			  <<imag(x) << ')';
} 
#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值