详解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 相关文章推荐
使用grappelli为django admin后台添加模板
Nov 18 Python
Python实现把xml或xsl转换为html格式
Apr 08 Python
用Python创建声明性迷你语言的教程
Apr 13 Python
Python配置mysql的教程(推荐)
Oct 13 Python
Python Requests库基本用法示例
Aug 20 Python
python 设置输出图像的像素大小方法
Jul 04 Python
python绘制多个子图的实例
Jul 07 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
Aug 20 Python
Python实现爬取网页中动态加载的数据
Aug 17 Python
详解如何在PyCharm控制台中输出彩色文字和背景
Aug 17 Python
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 Python
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
Aug 14 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
JAVA/JSP学习系列之四
2006/10/09 PHP
php 操作excel文件的方法小结
2009/12/31 PHP
php检索或者复制远程文件的方法
2015/03/13 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
2017/08/07 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
js确定对象类型方法
2012/03/30 Javascript
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
jquery库或JS文件在eclipse下报错问题解决方法
2014/04/17 Javascript
jquery使用each方法遍历json格式数据实例
2015/05/18 Javascript
jQuery Ajax使用FormData对象上传文件的方法
2016/09/07 Javascript
微信小程序 教程之注册程序
2016/10/17 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
详解vue的数据binding绑定原理
2017/04/12 Javascript
vue-router实现组件间的跳转(参数传递)
2017/11/07 Javascript
react-router browserHistory刷新页面404问题解决方法
2017/12/29 Javascript
Vue中v-for的数据分组实例
2018/03/07 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
vue中 this.$set的用法详解
2019/09/06 Javascript
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
让python在hadoop上跑起来
2016/01/27 Python
Python subprocess库的使用详解
2018/10/26 Python
Python补齐字符串长度的实例
2018/11/15 Python
Django中的用户身份验证示例详解
2019/08/07 Python
关于Theano和Tensorflow多GPU使用问题
2020/06/19 Python
python爬取豆瓣电影排行榜(requests)的示例代码
2021/02/18 Python
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
Lululemon英国官网:加拿大瑜伽服装品牌
2019/01/14 全球购物
越南母婴用品购物网站:Kids Plaza
2020/04/09 全球购物
文员的职业生涯规划发展方向
2014/02/08 职场文书
战略合作意向书范本
2014/04/01 职场文书
个人授权委托书模板
2014/09/14 职场文书
付款承诺函范文
2015/01/21 职场文书
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
2021/06/07 Python