详解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错误处理详解
Sep 28 Python
Python格式化压缩后的JS文件的方法
Mar 05 Python
解决pycharm无法调用pip安装的包问题
May 18 Python
利用python库在局域网内传输文件的方法
Jun 04 Python
详解pandas删除缺失数据(pd.dropna()方法)
Jun 25 Python
Python PyPDF2模块安装使用解析
Jan 19 Python
python用pip install时安装失败的一系列问题及解决方法
Feb 24 Python
基于Tensorflow一维卷积用法详解
May 22 Python
使用Keras预训练好的模型进行目标类别预测详解
Jun 27 Python
从python读取sql的实例方法
Jul 21 Python
Python生成pdf目录书签的实例方法
Oct 29 Python
Python爬虫自动化爬取b站实时弹幕实例方法
Jan 26 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
JS 网站性能优化笔记
2011/05/24 PHP
php smarty模板引擎的6个小技巧
2014/04/24 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
php文件上传类完整实例
2016/05/14 PHP
Laravel SQL语句记录方式(推荐)
2016/05/26 PHP
在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码
2007/02/15 Javascript
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
Jquery 最近浏览过的商品的功能实现代码
2010/05/14 Javascript
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
JS比较两个时间大小的简单示例代码
2013/12/20 Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
2014/06/24 Javascript
浅谈JavaScript中的Math.atan()方法的使用
2015/06/14 Javascript
JavaScript声明变量名的语法规则
2015/07/10 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
举例讲解jQuery中可见性过滤选择器的使用
2016/04/18 Javascript
纯css下拉菜单 无需js
2016/08/15 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
Vue数据绑定简析小结
2019/05/07 Javascript
关于layui toolbar和template的结合使用方法
2019/09/19 Javascript
Openlayers显示地理位置坐标的方法
2020/09/28 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
Python中分数的相关使用教程
2015/03/30 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
Python队列的定义与使用方法示例
2017/06/24 Python
对python中的pop函数和append函数详解
2018/05/04 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
2020/04/22 Python
python 进制转换 int、bin、oct、hex的原理
2021/01/13 Python
英国高街奥特莱斯:Highstreet Outlet
2019/11/21 全球购物
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
关于运动会的稿件
2014/02/02 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
四风问题党员个人整改措施
2014/10/27 职场文书
会计工作能力自我评价
2015/03/05 职场文书
中学感恩教育活动总结
2015/05/05 职场文书
煤矿施工安全协议书
2016/03/22 职场文书
Python词云的正确实现方法实例
2021/05/08 Python