详解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中查看变量内存地址的方法
May 05 Python
为什么入门大数据选择Python而不是Java?
Mar 07 Python
python3.5绘制随机漫步图
Aug 27 Python
Python线程同步的实现代码
Oct 03 Python
python机器人运动范围问题的解答
Apr 29 Python
对Python中TKinter模块中的Label组件实例详解
Jun 14 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
Aug 27 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
Mar 09 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
May 25 Python
Anaconda使用IDLE的实现示例
Sep 23 Python
Python基础详解之邮件处理
Apr 28 Python
2021年最新用于图像处理的Python库总结
Jun 15 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中判断变量为空的几种方法分享
2013/08/26 PHP
ThinkPHP惯例配置文件详解
2014/07/14 PHP
php使用curl简单抓取远程url的方法
2015/03/13 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
yii2安装详细流程
2018/05/23 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
JavaScript 无符号右移赋值操作
2009/04/17 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
javascript限制文本框输入值类型的方法
2015/05/07 Javascript
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
Bootstrap每天必学之附加导航(Affix)插件
2016/04/25 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐)
2016/06/23 Javascript
在web中js实现类似excel的表格控件
2016/09/01 Javascript
Angular页面间切换及传值的4种方法
2016/11/04 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
2020/10/27 Javascript
node.js如何操作MySQL数据库
2020/10/29 Javascript
vue实现轮播图帧率播放
2021/01/26 Vue.js
[02:53]DOTA2亚洲邀请赛 NewBee战队巡礼
2015/02/03 DOTA
详解用python实现简单的遗传算法
2018/01/02 Python
python文本数据相似度的度量
2018/03/12 Python
python re正则匹配网页中图片url地址的方法
2018/12/20 Python
python统计函数库scipy.stats的用法解析
2020/02/25 Python
python简单实现插入排序实例代码
2020/12/16 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
如何进行Linux分区优化
2016/09/13 面试题
大四学生思想汇报
2014/01/13 职场文书
工厂车间标语
2014/06/19 职场文书
Mysql MVCC机制原理详解
2021/04/20 MySQL
python turtle绘制多边形和跳跃和改变速度特效
2022/03/16 Python
Python Matplotlib绘制两个Y轴图像
2022/04/13 Python