详解C++编程中一元运算符的重载

 更新时间:2016年01月19日 17:32:29   投稿:goldensun  
这篇文章主要介绍了C++编程中一元运算符的重载,特别对递增和递减运算符重载作了着重讲解,需要的朋友可以参考下

可重载的一元运算符如下:

  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登录WeChat 实现自动回复实例详解

    python登录WeChat 实现自动回复实例详解

    在本篇内容里小编给大家整理的是关于python登录WeChat 实现自动回复的相关实例内容以及知识点总结,有兴趣的朋友们参考下。
    2019-05-05
  • Python 函数装饰器详解

    Python 函数装饰器详解

    这篇文章主要介绍了Python函数装饰器,结合实例形式详细分析了Python装饰器的原理、功能、分类、常见操作技巧与使用注意事项,需要的朋友可以参考下
    2021-10-10
  • Python Pandas中布尔索引的用法详解

    Python Pandas中布尔索引的用法详解

    布尔索引是一种使用 DataFrame 中数据的实际值的索引。本文将通过一些示例为大家详细讲讲Python中布尔索引的用法,需要的可以参考一下
    2022-08-08
  • Python如何识别银行卡卡号?

    Python如何识别银行卡卡号?

    今天给大家带来的是有关Python的相关知识,文章围绕着Python如何识别银行卡卡号展开,文中有非常详细的代码示例及介绍,需要的朋友可以参考下
    2021-06-06
  • Python Flask框架实现小红书图片无水印解析下载

    Python Flask框架实现小红书图片无水印解析下载

    这篇文章主要为大家介绍了Python Flask框架实现小红书图片无水印解析下载,需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 聊聊pytorch测试的时候为何要加上model.eval()

    聊聊pytorch测试的时候为何要加上model.eval()

    这篇文章主要介绍了聊聊pytorch测试的时候为何要加上model.eval()的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Python实现获取本地及远程图片大小的方法示例

    Python实现获取本地及远程图片大小的方法示例

    这篇文章主要介绍了Python实现获取本地及远程图片大小的方法,结合实例形式分析了Python使用PIL、urllib2及cStringIO模块获取本机或远程图片大小信息的相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • 一文搞懂​​​​​​​python可迭代对象,迭代器,生成器,协程

    一文搞懂​​​​​​​python可迭代对象,迭代器,生成器,协程

    这篇文章主要介绍了一文搞懂​​​​​​​python可迭代对象,迭代器,生成器,协程,微博吱嘎部分围绕主题展开详细介绍,需要的小伙伴可以参考一下
    2022-05-05
  • python操作日期和时间的方法

    python操作日期和时间的方法

    经常获得了一个用户提交的当前日期,我们需要以这个日期为依据返回它的前一天、后一天的日期或者转换操作等。用Python可以非常简单的解决这些关于日期计算的问题
    2014-03-03
  • 如何利用python检测图片是否包含二维码

    如何利用python检测图片是否包含二维码

    这篇文章主要介绍了如何利用python检测图片是否包含二维码,帮助大家更好的利用python处理图片,感兴趣的朋友可以了解下
    2020-10-10

最新评论