详解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绘制数据的瀑布图的教程
Apr 07 Python
Python中返回字典键的值的values()方法使用
May 22 Python
python脚本内运行linux命令的方法
Jul 02 Python
Python爬虫之UserAgent的使用实例
Feb 21 Python
浅谈django2.0 ForeignKey参数的变化
Aug 06 Python
python3多线程知识点总结
Sep 26 Python
Python values()与itervalues()的用法详解
Nov 27 Python
python数据预处理 :数据抽样解析
Feb 24 Python
Python环境下安装PyGame和PyOpenGL的方法
Mar 25 Python
pygame实现弹球游戏
Apr 14 Python
python FTP编程基础入门
Feb 27 Python
分析Python list操作为什么会错误
Nov 17 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
解决GD中文乱码问题
2007/02/14 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
生成随机字符串和验证码的类的PHP实例
2013/12/24 PHP
CodeIgniter CLI模式简介
2014/06/17 PHP
JS对URL字符串进行编码/解码分析
2008/10/25 Javascript
javascript 限制输入脚本大全
2009/11/03 Javascript
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
2010/03/23 Javascript
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
什么是json和jsonp,jQuery json实例详详细说明
2012/12/11 Javascript
javascript中call和apply方法浅谈
2013/09/27 Javascript
JS验证身份证有效性示例
2013/10/11 Javascript
jQuery控制iFrame(实例代码)
2013/11/19 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
浅谈Web页面向后台提交数据的方式和选择
2016/09/23 Javascript
JavaScript仿微博发布信息案例
2016/11/16 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
微信小程序实现轮播图效果
2017/09/07 Javascript
基于Bootstrap实现城市三级联动
2017/11/23 Javascript
JS实现的JSON序列化操作简单示例
2018/07/02 Javascript
vue通过数据过滤实现表格合并
2020/11/30 Javascript
Layui数据表格跳转到指定页的实现方法
2019/09/05 Javascript
使用layer.msg 时间设置不起作用的解决方法
2019/09/12 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
2020/02/13 Javascript
python中使用sys模板和logging模块获取行号和函数名的方法
2014/04/15 Python
Python的requests网络编程包使用教程
2016/07/11 Python
Python中装饰器高级用法详解
2017/12/25 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
2020/02/12 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
2015年城管个人工作总结范文
2015/04/20 职场文书
python图片灰度化处理的几种方法
2021/06/23 Python
python基础之类方法和静态方法
2021/10/24 Python
「约定的梦幻岛」作画发布诺曼生日新绘
2022/03/21 日漫
详细介绍Java中的CyclicBarrier
2022/04/13 Java/Android