详解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 11 Python
python 实现tar文件压缩解压的实例详解
Aug 20 Python
Python中scatter函数参数及用法详解
Nov 08 Python
在CentOS6上安装Python2.7的解决方法
Jan 09 Python
python try except 捕获所有异常的实例
Oct 18 Python
python保存二维数组到txt文件中的方法
Nov 15 Python
python分布式编程实现过程解析
Nov 08 Python
pymysql模块的操作实例
Dec 17 Python
python json 递归打印所有json子节点信息的例子
Feb 27 Python
Python爬虫程序架构和运行流程原理解析
Mar 09 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
Jun 14 Python
Python中的tkinter库简单案例详解
Jan 22 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/06/23 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
PHP面向对象程序设计类的定义与用法简单示例
2016/12/27 PHP
PHP实现的下载远程文件类定义与用法示例
2017/07/05 PHP
PHP+ajax实现获取新闻数据简单示例
2018/05/08 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
Hutia 的 JS 代码集
2006/10/24 Javascript
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
Javascript 是你的高阶函数(高级应用)
2015/06/15 Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
2016/06/12 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
vue组件编写之todolist组件实例详解
2018/01/22 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
python获取网页状态码示例
2014/03/30 Python
Python在图片中添加文字的两种方法
2017/04/29 Python
Python 自动化表单提交实例代码
2017/06/08 Python
Python实现KNN邻近算法
2021/01/28 Python
python的re正则表达式实例代码
2018/01/24 Python
说说如何遍历Python列表的方法示例
2019/02/11 Python
Python 的字典(Dict)是如何存储的
2019/07/05 Python
MNIST数据集转化为二维图片的实现示例
2020/01/10 Python
Python运行提示缺少模块问题解决方案
2020/04/02 Python
澳大利亚最超值的自行车之家:Reid Cycles
2019/03/24 全球购物
T3官网:头发造型工具
2019/12/26 全球购物
美术教学感言
2014/02/22 职场文书
爱岗敬业演讲稿
2014/05/05 职场文书
2014中考励志标语
2014/06/05 职场文书
优秀家长自荐材料
2014/08/26 职场文书
公司领导班子对照检查存在问题整改措施
2014/10/02 职场文书
小学语文的各类谚语(70首)
2019/08/15 职场文书