详解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 不同对象比较大小示例探讨
Aug 21 Python
Python自动化开发学习之三级菜单制作
Jul 14 Python
利用python实现微信头像加红色数字功能
Mar 26 Python
Python 实现选择排序的算法步骤
Apr 22 Python
Python中偏函数用法示例
Jun 07 Python
判断python对象是否可调用的三种方式及其区别详解
Jan 31 Python
Python后台开发Django的教程详解(启动)
Apr 08 Python
PYTHON实现SIGN签名的过程解析
Oct 28 Python
pytorch masked_fill报错的解决
Feb 18 Python
用python实现名片管理系统
Jun 18 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
Feb 26 Python
Django显示可视化图表的实践
May 10 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获取网络上文件
2006/10/09 PHP
php与java通过socket通信的实现代码
2013/10/21 PHP
php中的字符编码转换函数用法示例
2014/10/20 PHP
php自定义hash函数实例
2015/05/05 PHP
使用ltrace工具跟踪PHP库函数调用的方法
2016/04/25 PHP
php查询及多条件查询
2017/02/26 PHP
js滚动条多种样式,推荐
2007/02/05 Javascript
javascript 获取图片颜色
2009/04/05 Javascript
jQuery ui1.7 dialog只能弹出一次问题
2009/08/27 Javascript
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
再谈querySelector和querySelectorAll的区别与联系
2012/04/20 Javascript
js替代copy(示例代码)
2013/11/27 Javascript
js对象继承之原型链继承实例
2015/01/10 Javascript
js中的内部属性与delete操作符介绍
2015/08/10 Javascript
跟我学习javascript的最新标准ES6
2015/11/20 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
慕课网题目之js实现抽奖系统功能
2017/09/19 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
2018/01/16 Javascript
用vue 实现手机触屏滑动功能
2020/05/28 Javascript
Vue中用JSON实现刷新界面不影响倒计时
2020/10/26 Javascript
在Python中使用dict和set方法的教程
2015/04/27 Python
Python发送email的3种方法
2015/04/28 Python
python机器学习之神经网络(二)
2017/12/20 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
Python xmltodict模块安装及代码实例
2020/10/05 Python
纯CSS3单页切换导航菜单界面设计的简单实现
2016/08/16 HTML / CSS
教师见习期自我鉴定
2014/04/28 职场文书
仲裁协议书
2014/09/26 职场文书
中学生旷课检讨书2篇
2014/10/09 职场文书
婚礼新人答谢词
2015/01/04 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
导游词之南京汤山温泉
2019/11/26 职场文书
详解用Python把PDF转为Word方法总结
2021/04/27 Python
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers