赞
踩
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.cpp和override4.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+调用生命周期更长,类似于一个函数返回的是一个全局变量形式。后项操作由于需要提前保存返回值,因此,在栈中申请了零时变量保存值。因此只能采用返回值方式。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。