详解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图像灰度变换及图像数组操作
Jan 27 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
Oct 15 Python
Python实现时间序列可视化的方法
Aug 06 Python
python函数的作用域及关键字详解
Aug 20 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
Aug 31 Python
python随机生成库faker库api实例详解
Nov 28 Python
Python Print实现在输出中插入变量的例子
Dec 25 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
Feb 26 Python
python 元组的使用方法
Jun 09 Python
Python 执行矩阵与线性代数运算
Aug 01 Python
python判断元素是否存在的实例方法
Sep 24 Python
Python+OpenCV实现图片中的圆形检测
Apr 07 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图片上传存储源码并且可以预览
2011/08/26 PHP
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
php+mysql数据库实现无限分类的方法
2014/12/12 PHP
Yii2创建表单(ActiveForm)方法详解
2016/07/23 PHP
EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
2017/04/04 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
2017/07/10 PHP
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
2009/11/04 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
javascrpt绑定事件之匿名函数无法解除绑定问题
2012/12/06 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
浅谈Javascript 执行顺序
2013/12/18 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
2014/06/22 Javascript
根据当前时间在jsp页面上显示上午或下午
2014/08/18 Javascript
js判断鼠标左、中、右键哪个被点击的方法
2015/01/27 Javascript
JQuery中两个ul标签的li互相移动实现方法
2015/05/18 Javascript
JS获取IMG图片高宽的简单实例
2016/05/17 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
JS中使用media实现响应式布局
2017/08/04 Javascript
js断点调试心得分享(必看篇)
2017/12/08 Javascript
理理Vue细节(推荐)
2019/04/16 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
[03:36]2015国际邀请赛第二日现场精彩集锦
2015/08/06 DOTA
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
Python中处理字符串的相关的len()方法的使用简介
2015/05/19 Python
Python使用urllib2模块实现断点续传下载的方法
2015/06/17 Python
使用Python制作微信跳一跳辅助
2018/01/31 Python
python如何为被装饰的函数保留元数据
2018/03/21 Python
Python递归实现打印多重列表代码
2020/02/27 Python
会计系毕业个人自荐信格式
2013/09/23 职场文书
大学自主招生自荐信
2013/12/16 职场文书
国贸专业的职业规划书
2014/03/15 职场文书
产品质量承诺范本
2014/03/31 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
债务纠纷起诉书
2015/05/20 职场文书
中国合伙人观后感
2015/06/02 职场文书
学习心理学心得体会
2016/01/22 职场文书