C++练习之override操作

C++override(覆盖)操作符是类封装中应用到最基本的操作,琢磨了下,才算是懂了点点,以下是自己的一些理解,如有不对之处,请指正,谢谢!

源码下载地址:git clone https://laneyu@bitbucket.org/laneyu/cplusplus.git

sample目录下既是本文所有例子测试代码

一、operator+操作

operator+操作主要有四种方式:

1.operator+作为一个free function(此处我理解为全局的,即不是类成员函数),可以携带两个参数,表达式类似于e1 + e2 = operator+(e1, e2)。此种操作不能够直接访问类里面的数据,只能访问public变量,因此,需要编写获取数据的接口,如getValue函数,测试例子如overridec.cpp文件所示。

2.operator+作为一个类成员函数,此种方式只能携带一个或者零个参数,表达式类似于e1 + e2 = e1.operator+(e2)。此种方式能够访问类的所有数据,因此,不需要接口,测试例子如override2.cpp文件所示。

3.operator+采用friend方式进行,该方式类似于方式1,但是与方式1不同的是采用friend可以看到类里面的所有数据,包括private类型。测试例子如override3.cppoverride4.cpp所示。


备注:friend方式可以细分为在class内部实现,或者在class外实现两种。

了解了operator+的操作方式以后,再去了解其他的,如operator-operator*等等就要容易些了。


参考资料:

http://stackoverflow.com/questions/15441633/number-of-arguments-in-operator-overload-in-c


二、复数类的实现

以下采用实现一个复数类来练习override相关操作,功能如下,并且全部采用了成员函数方式进行,具体代码在complex.cpp中。

Complex operator+(Complex& c2);    //+

Complex operator-(Complex& c2);     //-

Complex operator*(Complex& c2);     //*

Complex operator/(Complex& c2);     ///

Complex& operator++();                  //prefix ++  

Complex operator++(int);                //postfix ++

Complex& operator--();                  //prefix --

Complex operator--(int);                //postfix --


了解了第一点以后,实现以上几个功能就要容易些。以下介绍下前项/后项加减操作。


考虑以下情况:

a = ++b;

以上代码段操作步骤如下:

1、b = b + 1

2、return b to a(返回b的值给a

 

a = b++;

以上代码段操作步骤如下:

1、save b value(保存b当前值)

2、b = b + 1

3、return b to a(返回b的值给a


因此,这就是后项++会比前项++多一个步骤,所以,我们在既可以用前项又可以用后项操作的过程中,应该尽量采用前项方式。

C++中操作方法如下:

Complex& Complex::operator++()  

{

    real_ = real_ + 1;

    imag_ = imag_ + 1;

 

    return *this;

}

 

//postfix++

Complex Complex::operator++(int)

{

    Complex tmp(*this);

 

    ++(*this);

 

    return tmp;

}

 

注意:C++中因为有引用方式操作方式,我们在使用前项的时候可以直接采用引用返回,而我们在使用后项操作的时候采用的是值返回。想想这是为什么?

我理解的是前项操作返回对象的生命周期比,operator+调用生命周期更长,类似于一个函数返回的是一个全局变量形式。后项操作由于需要提前保存返回值,因此,在栈中申请了零时变量保存值。因此只能采用返回值方式。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值