详解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学习之asyncore模块用法实例教程
Sep 29 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
Jun 30 Python
Python实现将json文件中向量写入Excel的方法
Mar 26 Python
在Python中通过getattr获取对象引用的方法
Jan 21 Python
Dlib+OpenCV深度学习人脸识别的方法示例
May 14 Python
将matplotlib绘图嵌入pyqt的方法示例
Jan 08 Python
Python中itertools的用法详解
Feb 07 Python
python日期与时间戳的各种转换示例
Feb 12 Python
Python QTimer实现多线程及QSS应用过程解析
Jul 11 Python
Python设计密码强度校验程序
Jul 30 Python
如何使用 Flask 做一个评论系统
Nov 27 Python
python自动生成sql语句的脚本
Feb 24 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 字符串 小常识
2009/06/05 PHP
最新的php 文件上传模型,支持多文件上传
2009/08/13 PHP
php getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
PHP 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
PHP Swoole异步读取、写入文件操作示例
2019/10/24 PHP
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
2014/10/14 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
javascript中Function类型详解
2015/04/28 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
2016/06/02 Javascript
JS实现留言板功能
2017/06/17 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步
2019/07/13 Javascript
微信小程序开发(一):服务器获取数据列表渲染操作示例
2020/06/01 Javascript
Vue获取微博授权URL代码实例
2020/11/04 Javascript
[52:57]2014 DOTA2国际邀请赛中国区预选赛 LGD-CDEC VS HGT
2014/05/21 DOTA
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
Python编程实现的简单Web服务器示例
2017/06/22 Python
python爬虫获取多页天涯帖子
2018/02/23 Python
python excel使用xlutils类库实现追加写功能的方法
2018/05/02 Python
pytorch 数据集图片显示方法
2018/07/26 Python
python 对字典按照value进行排序的方法
2019/05/09 Python
keras模型可视化,层可视化及kernel可视化实例
2020/01/24 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
2020/03/10 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
python实现感知机模型的示例
2020/09/30 Python
StubHub中国:购买和出售全球活动门票
2020/01/01 全球购物
高中生校园生活自我评价
2013/09/19 职场文书
学校采购员岗位职责
2014/01/02 职场文书
模范家庭事迹材料
2014/02/10 职场文书
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
我是特种兵观后感
2015/06/11 职场文书