详解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中的with...as用法介绍
May 28 Python
Python贪吃蛇游戏编写代码
Oct 26 Python
Python中如何优雅的合并两个字典(dict)方法示例
Aug 09 Python
Python 3.6 -win64环境安装PIL模块的教程
Jun 20 Python
Pandas之MultiIndex对象的示例详解
Jun 25 Python
python GUI图形化编程wxpython的使用
Jul 19 Python
Python 使用list和tuple+条件判断详解
Jul 30 Python
django框架中间件原理与用法详解
Dec 10 Python
python tkinter之 复选、文本、下拉的实现
Mar 04 Python
python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码
Jun 11 Python
Python读取图像并显示灰度图的实现
Dec 01 Python
对PyTorch中inplace字段的全面理解
May 22 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
网页游戏开发入门教程三(简单程序应用)
2009/11/02 PHP
处理单名多值表单的详解
2013/06/08 PHP
如何在PHP中读写文件
2020/09/07 PHP
JQuery 引发两次$(document.ready)事件
2010/01/15 Javascript
JSQL  一个 web DB 的封装
2010/05/05 Javascript
MyEclipse取消验证Js的两种方法
2013/11/14 Javascript
jQuery大于号(>)选择器的作用解释
2015/01/13 Javascript
Javascript中的作用域和上下文深入理解
2015/07/03 Javascript
js判断鼠标位置是否在某个div中的方法
2016/02/26 Javascript
jQuery对象的链式操作用法分析
2016/05/10 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
微信小程序 switch组件详解及简单实例
2017/01/10 Javascript
node.js的事件机制
2017/02/08 Javascript
vue内置组件transition简单原理图文详解(小结)
2018/07/12 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
2018/10/29 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
vue监听滚动事件的方法
2020/12/21 Vue.js
python里大整数相乘相关技巧指南
2014/09/12 Python
Python实现在Linux系统下更改当前进程运行用户
2015/02/04 Python
Python subprocess模块详细解读
2018/01/29 Python
Python读取指定日期邮件的实例
2019/02/01 Python
python取均匀不重复的随机数方式
2019/11/27 Python
tensorflow 实现数据类型转换
2020/02/17 Python
python实现IOU计算案例
2020/04/12 Python
keras中模型训练class_weight,sample_weight区别说明
2020/05/23 Python
全国道德模范事迹
2014/02/01 职场文书
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
社区清明节活动总结
2014/07/04 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
2015年安全生产责任书
2015/01/30 职场文书
商场营业员岗位职责
2015/04/14 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
公司开业致辞
2015/07/29 职场文书