详解C++编程中一元运算符的重载


Posted in Python onJanuary 19, 2016

可重载的一元运算符如下:

  1. !(逻辑“非”)
  2. &(取址)
  3. ~(二进制反码)
  4. *(取消指针引用)
  5. +(一元加)
  6. -(一元求反)
  7. ++(递增)
  8. --(递减)
  9. 转换运算符

后缀递增和递减运算符(++ 和 ??)在递增和递减中单独处理,下面会讲到。

以下规则适用于所有其他一元运算符。若要将一元运算符函数声明为非静态成员,则必须用以下形式声明它:
ret-type operator op ()
其中 ret-type 是返回类型,op 是上表中列出的运算符之一。
若要将一元运算符函数声明为全局函数,则必须用以下形式声明它:
ret-type operator op (arg )
其中 ret-type 和 op 如上所述用于成员运算符函数,arg 是要参与运算的类类型的参数。
注意
一元运算符的返回类型没有限制。例如,逻辑“非”(!) 返回整数值是合理的,但并非强制性的。

递增和递减运算符重载
由于递增和递减运算符各有两个变量,因此它们属于一个特殊类别:

  • 前置递增和后置递增
  • 前置递减和后置递减

编写重载的运算符函数时,为这些运算符的前缀和后缀版本实现单独的版本很有用。若要区分这两者,请遵循以下规则:运算符的前缀形式与声明任何其他一元运算符的方式完全相同;后缀形式接受 int 类型的其他参数。

注意
当为递增或递减运算符的前缀形式指定重载运算符时,其他参数的类型必须是 int;指定任何其他类型都将产生错误。
以下示例显示如何为 Point 类定义前缀和后缀递增和递减运算符:

// increment_and_decrement1.cpp
class Point
{
public:
  // Declare prefix and postfix increment operators.
  Point& operator++();    // Prefix increment operator.
  Point operator++(int);   // Postfix increment operator.

  // Declare prefix and postfix decrement operators.
  Point& operator--();    // Prefix decrement operator.
  Point operator--(int);   // Postfix decrement operator.

  // Define default constructor.
  Point() { _x = _y = 0; }

  // Define accessor functions.
  int x() { return _x; }
  int y() { return _y; }
private:
  int _x, _y;
};

// Define prefix increment operator.
Point& Point::operator++()
{
  _x++;
  _y++;
  return *this;
}

// Define postfix increment operator.
Point Point::operator++(int)
{
  Point temp = *this;
  ++*this;
  return temp;
}

// Define prefix decrement operator.
Point& Point::operator--()
{
  _x--;
  _y--;
  return *this;
}

// Define postfix decrement operator.
Point Point::operator--(int)
{
  Point temp = *this;
  --*this;
  return temp;
}
int main()
{
}

可使用以下函数头在文件范围中(全局)定义同一运算符:

friend Point& operator++( Point& )   // Prefix increment
friend Point& operator++( Point&, int ) // Postfix increment
friend Point& operator--( Point& )   // Prefix decrement
friend Point& operator--( Point&, int ) // Postfix decrement

表示递增或递减运算符的后缀形式的 int 类型的参数不常用于传递参数。它通常包含值 0。但是,可按以下方式使用它:

// increment_and_decrement2.cpp
class Int
{
public:
  Int &operator++( int n );
private:
  int _i;
};

Int& Int::operator++( int n )
{
  if( n != 0 )  // Handle case where an argument is passed.
    _i += n;
  else
    _i++;    // Handle case where no argument is passed.
  return *this;
}
int main()
{
  Int i;
  i.operator++( 25 ); // Increment by 25.
}

除显式调用之外,没有针对使用递增或递减运算符来传递这些值的语法,如前面的代码所示。实现此功能的更直接的方法是重载加法/赋值运算符 (+=)。

Python 相关文章推荐
Python实现将照片变成卡通图片的方法【基于opencv】
Jan 17 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
Feb 07 Python
python3获取两个日期之间所有日期,以及比较大小的实例
Apr 08 Python
DataFrame 将某列数据转为数组的方法
Apr 13 Python
pandas ix &iloc &loc的区别
Jan 10 Python
python内存监控工具memory_profiler和guppy的用法详解
Jul 29 Python
关于Tensorflow分布式并行策略
Feb 03 Python
Python基于gevent实现高并发代码实例
May 15 Python
pycharm配置python 设置pip安装源为豆瓣源
Feb 05 Python
pytorch显存一直变大的解决方案
Apr 08 Python
python数据分析之用sklearn预测糖尿病
Apr 22 Python
python cv2图像质量压缩的算法示例
Jun 04 Python
Python中使用Queue和Condition进行线程同步的方法
Jan 19 #Python
简单总结Python中序列与字典的相同和不同之处
Jan 19 #Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 #Python
Python的自动化部署模块Fabric的安装及使用指南
Jan 19 #Python
Python编程中time模块的一些关键用法解析
Jan 19 #Python
Python编程中的文件读写及相关的文件对象方法讲解
Jan 19 #Python
Python使用os模块和fileinput模块来操作文件目录
Jan 19 #Python
You might like
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
JS截取字符串常用方法整理及使用示例
2013/10/18 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
详解axios在vue中的简单配置与使用
2017/05/10 Javascript
浅谈Angular4中常用管道
2017/09/27 Javascript
vue mint-ui学习笔记之picker的使用
2017/10/11 Javascript
原生JS实现的简单轮播图功能【适合新手】
2018/08/17 Javascript
vuejs 制作背景淡入淡出切换动画的实例
2018/09/01 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
2019/04/29 Javascript
iphone刘海屏页面适配方法
2019/05/07 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
解决layui弹框失效的问题
2019/09/09 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
在Django框架中编写Context处理器的方法
2015/07/20 Python
浅谈python写入大量文件的问题
2018/11/09 Python
python2.7实现邮件发送功能
2018/12/12 Python
通过shell+python实现企业微信预警
2019/03/07 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
python文本数据处理学习笔记详解
2019/06/17 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
2019/07/04 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
2019/09/06 Python
如何定义TensorFlow输入节点
2020/01/23 Python
python 使用事件对象asyncio.Event来同步协程的操作
2020/05/04 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
python工具快速为音视频自动生成字幕(使用说明)
2021/01/27 Python
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
举例说明类变量和实例变量的区别
2016/06/30 面试题
证券期货行业个人的自我评价
2013/12/26 职场文书
生产助理岗位职责
2014/06/18 职场文书
兽医医药专业求职信
2014/07/27 职场文书
庆七一宣传标语
2014/10/08 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
90行Python代码开发个人云盘应用
2021/04/20 Python