gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章详解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 类定义前缀和后缀递增和递减运算符:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// 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()
{
}

可使用以下函数头在文件范围中(全局)定义同一运算符:

?
1
2
3
4
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。但是,可按以下方式使用它:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 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.
}

除显式调用之外,没有针对使用递增或递减运算符来传递这些值的语法,如前面的代码所示。实现此功能的更直接的方法是重载加法/赋值运算符 (+=).

最后此篇关于详解C++编程中一元运算符的重载的文章就讲到这里了,如果你想了解更多关于详解C++编程中一元运算符的重载的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com