详解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提示No module named images的解决方法
Sep 29 Python
python将ip地址转换成整数的方法
Mar 17 Python
python中map()与zip()操作方法
Feb 27 Python
浅析Python中的for 循环
Jun 09 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
python如何生成网页验证码
Jul 28 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
Python获取时间范围内日期列表和周列表的函数
Aug 05 Python
python实现低通滤波器代码
Feb 26 Python
Django之choices选项和富文本编辑器的使用详解
Apr 01 Python
基于python图书馆管理系统设计实例详解
Aug 05 Python
python 操作excel表格的方法
Dec 05 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/02/04 PHP
PHP中substr函数字符串截取用法分析
2016/01/07 PHP
PHP中的随机性 你觉得自己幸运吗?
2016/01/22 PHP
Yii2实现log输出到file及database的方法
2016/11/12 PHP
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
2007/07/11 Javascript
Javascript Select操作大集合
2009/05/26 Javascript
Js组件的一些写法
2010/09/10 Javascript
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
Vue.JS入门教程之列表渲染
2016/12/01 Javascript
教你快速搭建Node.Js服务器的方法教程
2017/03/30 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
解决vue一个页面中复用同一个echarts组件的问题
2020/07/19 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
Python中处理字符串之islower()方法的使用简介
2015/05/19 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
2017/11/11 Python
python+matplotlib绘制旋转椭圆实例代码
2018/01/12 Python
python flask中静态文件的管理方法
2018/03/20 Python
Python基于生成器迭代实现的八皇后问题示例
2018/05/23 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
Django实现文件上传下载功能
2019/10/06 Python
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
澳大利亚最大的在线美发和美容零售商之一:My Hair Care & Beauty
2019/08/24 全球购物
东方通信股份有限公司VC面试题
2014/08/27 面试题
大学生专业个人学习的自我评价
2013/10/26 职场文书
奥巴马胜选演讲稿
2014/05/15 职场文书
垃圾分类的活动方案
2014/08/15 职场文书
房屋买卖协议样本
2014/11/16 职场文书
Pytorch 使用tensor特定条件判断索引
2021/04/08 Python
element多个表单校验的实现
2021/05/27 Javascript
Nginx如何获取自定义请求header头和URL参数详解
2022/07/23 Servers