complex.h:
# ifndef __COMPLEX__
# define __COMPLEX__
class complex
{
}
# endif
# ifndef __COMPLEX__
# define __COMPLEX__
class complex
{
public:
double real() const {return re;}
double imag() const {return im;}
private:
doubel re,im;
}
# endif
double real () `const` {return re;}
double imag() `const` {return im;}
既然函数不会改变对象,那么就如实说明,编译器能帮你确保函数的const属性,阅读代码的人也明确你的意图。
而且,const对象才可以调用这些函数——const对象不能够调用非const成员函数。
class complex
{
public:
complex(double r = 0, double i =0)
: re(r), im(i) { }
private:
doubel re,im;
}
在初始值列表中,才是初始化。在构造函数体内的,叫做赋值。
为complex 类添加一个+=操作符:
class complex
{
public:
complex& operator += (const complex &)
}
使用引用避免类对象构造与析构的开销,使用const确保参数不会被改变。内置类型的值传递与引用传递效率没有多大差别,甚至值传递效率会更高。
例如,传递char类型时,值传递只需传递一个字节;引用实际上是指针实现,需要四个字节(32位机)的传递开销。但是为了一致,不妨统一使用引用。
以引用方式返回函数局部变量会引发程序未定义行为,离开函数作用域局部变量被销毁,引用该变量没有意义。但是我要说的是,如果可以,函数应该返回引用。
当然,要放回的变量要有一定限制:该变量的在进入函数前,已经被分配了内存。以此条件来考量,很容易决定是否要放回引用。而在函数被调用时才创建出来的对象,一定不能返回引用。
说回operator +=,其返回值就是引用,原因在于,执行a+=b时,a已经在内存上存在了。
而operator + ,其返回值不能是引用,因为a+b的值,在调用operator +的时候才产生。
下面是operator+= 与’operator +’ 的实现:
inline complex & complex :: operator += (const complex & r)
{
this -> re+= r->re;
this -> im+= r->im;
return * this;
}
inline complex operator + (const complex & x , const complex & y)
{
return complex ( real (x)+ real (y), //新创建的对象,不能返回引用
imag(x)+ imag(y));
}
在operator +=中返回引用还是必要的,这样可以使用连续的操作:
c3 += c2 += c1;
就我们的复数类来说,+可以有多种使用方式:
complex c1(2,1);
complex c2;
c2 = c1+ c2;
c2 = c1 + 5;
c2 = 7 + c1;
为了应付怎么多种加法,+需要有如下三种重载:
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));
}
推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:
零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)
https://xxetb.xet.tech/s/3Zqhgt