详解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将多个文本文件合并为一个文本的代码(便于搜索)
Mar 13 Python
给Python IDLE加上自动补全和历史功能
Nov 30 Python
python获取mp3文件信息的方法
Jun 15 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
Feb 14 Python
Python count函数使用方法实例解析
Mar 23 Python
python 解决Fatal error in launcher:错误问题
May 21 Python
python3+openCV 获取图片中文本区域的最小外接矩形实例
Jun 02 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
Aug 04 Python
Python如何使用input函数获取输入
Aug 06 Python
python openssl模块安装及用法
Dec 06 Python
教你利用Selenium+python自动化来解决pip使用异常
May 20 Python
python实现简单聊天功能
Jul 07 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
Adodb的十个实例(清晰版)
2006/12/31 PHP
php中在PDO中使用事务(Transaction)
2011/05/14 PHP
PHP生成不重复随机数的方法汇总
2014/11/19 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
2016/03/18 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
2015/02/16 Javascript
JS基于面向对象实现的拖拽库实例
2015/09/24 Javascript
Webpack 实现 Node.js 代码热替换
2015/10/22 Javascript
vue cli webpack中使用sass的方法
2018/02/24 Javascript
浅析Visual Studio Code断点调试Vue
2018/02/27 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
基于vue实现web端超大数据量表格的卡顿解决
2019/04/02 Javascript
浅谈Vue 函数式组件的使用技巧
2020/06/16 Javascript
深度解读vue-resize的具体用法
2020/07/08 Javascript
js实现简单选项卡制作
2020/08/05 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
python中日志logging模块的性能及多进程详解
2017/07/18 Python
遗传算法python版
2018/03/19 Python
Python内置函数reversed()用法分析
2018/03/20 Python
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
AmazeUI导航的示例代码
2020/08/14 HTML / CSS
应届实习生的自我评价范文
2014/01/05 职场文书
家长学校实施方案
2014/03/15 职场文书
财务会计专业自荐书
2014/06/30 职场文书
2014年店长工作总结
2014/11/17 职场文书
英语感谢信范文
2015/01/20 职场文书
学生犯错保证书
2015/05/09 职场文书
element多个表单校验的实现
2021/05/27 Javascript
python自动化操作之动态验证码、滑动验证码的降噪和识别
2021/08/30 Python