#ifndef __COMPLEX__
#define __COMPLEX__
class complex
{
public:
complex(double r = 0, double i = 0)
: re(r), im(i)
{
}
complex& operator + = (const complex&);
double real() {
return re; }
double imag() {
return im; }
private:
double re, im;
friend complex& __doapl(complex*,
const complex&);
};
#endif
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 complex
operator + (const complex& x, const complex& y)
{
return complex ( real (x) + real (y),
imag (x) + imag (y) );
}
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));
}
#include
ostream&
operator << (ostream& os,
const complex& x)
{
return os << '(' << real(x) << ','
<< imag(x) << ')';
}
类内:
- 防卫式的常数定义
- 设计一个复数 写出class头
- 考虑复数要存放的数据,放于private中(实部虚部),并考虑实部虚部的数据类型(double)
- 考虑有哪些函数操作于复数上(每一个class都要去想它的构造函数),考虑其是否需要默认值,考虑其传递方式是pass by reference or pass by value
- 构造函数特殊语法:initialization list(初值列)即设初值
- 作为一个复数设计者,思考该复数类具有什么能力并设计
(1)设计+=
(2)设计取得实部和取得虚部 --思考会不会改动re im数据
- 为了取得私有的实部虚部的数据,在class中声明friend函数
类的本体外:
- +=的操作符重载(思考其参数)
- 考虑它的return type,所传出去的如果不是函数本体内创建的就可以引用
- 定义部分:把+=丢给新定义的函数去做,也将收到的参数往下一步操作的函数传递
- 根据收到的参数类型确定新定义函数的参数类型
- 考虑return type,使其成为inline
- 函数体内设计+=:右边的参数加到左边的参数上 (由此可以看出右边参数为不可变的const类型),返回指针参数
- 设计全局函数(无类的名称),传递两个常量
- 创建一个新的对象用于放置 左常量+右常量:类的名称后加( )即创建新object
- 考虑到复数的不同加法类型
- 把复数输出设为cout(操作符重载) 》cout<
- 返回ostream 参数的引用