C++运算符重载规则详解

 更新时间:2015年09月18日 15:50:28   投稿:goldensun  
这篇文章主要介绍了C++运算符重载规则详解,是C++入门学习中的基础知识,需要的朋友可以参考下

C++允许重载的运算符和不允许重载的运算符
C++中绝大部分的运算符允许重载,具体规定见表

不能重载的运算符只有5个:
.  (成员访问运算符)
.*  (成员指针访问运算符)
::  (域运算符)
sizeof  (长度运算符)
?:  (条件运算符)

前两个运算符不能重载是为了保证访问成员的功能不能被改变,域运算符和sizeof 运算符的运算对象是类型而不是变量或一般表达式,不具备重载的特征。

C++运算符重载的规则
C++对运算符重载定义了如下几条规则。

1) C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。 例如,有人觉得BASIC中用“**“作为幂运算符很方便,也想在C++中将”**“定义为幂运算符,用”3**5“表示35,这样是不行的。

2) 重载不能改变运算符运算对象(即搡作数)的个数。如关系运算符“>”和“ <” 等是双目运算符,重载后仍为双目运算符,需要两个参数。运算符“ +”,“-”,“*”,“&”等既可以作为单目运算符,也可以作为双目运算符,可以分别将它们重载为单目运算符或双目运算符。

3) 重载不能改变运算符的优先级别。例如“*”和“/”优先于“ +”和“-”,不论怎样进行重载,各运算符之间的优先级别不会改变。有时在程序中希望改变某运算符的优先级,也只能使用加圆括号的办法强制改变重载运算符的运算顺序。

4) 重载不能改变运算符的结含性。如赋值运算符是右结合性(自右至左),重载后仍为右结合性。

5) 重载运算符的函数不能有默认的参数,否则就改变了运算符参数的个数,与前面第(2)点矛盾。

6) 重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。也就是说,参数不能全部是C++的标准类型,以防止用户修改用于标准类型数据的运算符的性质,如下面这样是不对的:

  int operator + (int a,int b)
  {
    retum(a-b);
  }


原来运算符+的作用是对两个数相加,现在企图通过重载使它的作用改为两个数相减。 如果允许这样重载的话,如果有表达式4+3,它的结果是7呢还是1?显然,这是绝对禁止的。

如果有两个参数,这两个参数可以都是类对象,也可以一个是类对象,一个是C ++标准类型的数据,如

  Complex operator + (int a,Complex&c)
  {
    return Complex(a +c.real, c.imag);
  }


它的作用是使一个整数和一个复数相加。

7) 用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“&”不必重载。

①赋值运算符( = )可以用于每一个类对象,可以利用它在同类对象之间相互赋值。 我们知道,可以用赋值运算符对类的对象賦值,这是因为系统已为每一个新声明的类重载了一个赋值运算符,它的作用是逐个复制类的数据成员。用户可以认为它是系统提供的默认的对象赋值运算符,可以直接用于对象间的赋值,不必自己进行重载。但是有时系统提供的默认的对象赋值运算符不能满足程序的要求,例如,数据成员中包含指向动态分配内存的指针成员时,在复制此成员时就可能出现危险。在这种情况下, 就需要自己重载赋值运算符。

②地址运算符&也不必重载,它能返回类对象在内存中的起始地址。

8) 从理论上说,可以将一个运算符重载为执行任意的操作,如可以将加法运算符重载为输出对象中的信息,将“>”运算符重载为“小于”运算。但这样违背了运算符重载的初衷,非但没有提髙可读性,反而使人莫名其妙,无法理解程序。应当使重载运算符的功能类似于该运算符作用于标准类型数据时所实现的功能(如用“+”实现加法,用“>”实现“大于”的关系运算)。

9) 运算符重载函数可以是类的成员函数,也可以是类的友元函数,还可以是既非类的成员函数也不是友元函敝的普通函数。

以上这些规则是很容易理解的,不必死记。把它们集中在一起介绍,只是为了使读者有一个整体的概念,也便于查阅。

相关文章

  • C++中vector容器的用法

    C++中vector容器的用法

    在c++中,vector是一个十分有用的容器。这篇文章主要介绍了C++ vector容器的用法的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • C语言实现简单通讯录功能

    C语言实现简单通讯录功能

    这篇文章主要为大家详细介绍了C语言实现简单通讯录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C++ bitset的简单使用示例

    C++ bitset的简单使用示例

    这篇文章主要介绍了C++ bitset的简单使用示例,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-11-11
  • C语言关键字大全(共32个)

    C语言关键字大全(共32个)

    这篇文章主要分享下C语言的32个关键字,需要的朋友可以参考下
    2013-07-07
  • c++实现逐行读取配置文件写入内存的示例

    c++实现逐行读取配置文件写入内存的示例

    这篇文章主要介绍了c++实现逐行读取配置文件写入内存的示例,需要的朋友可以参考下
    2014-05-05
  • C语言中字符串实现正序与逆序实例详解

    C语言中字符串实现正序与逆序实例详解

    这篇文章主要介绍了C语言中字符串实现倒叙实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • C++使用printf语句实现进制转换的示例代码

    C++使用printf语句实现进制转换的示例代码

    在C语言中,printf 函数可以直接实现部分进制转换功能,通过格式说明符(format specifier)快速输出不同进制的数值,下面给大家分享C++使用printf语句实现进制转换的示例代码,感兴趣的朋友一起看看吧
    2025-04-04
  • C++ OpenCV技术实战之身份证离线识别

    C++ OpenCV技术实战之身份证离线识别

    OpenCV身份证离线识别技术的主要技术就是通过OpenCV找到身份证号码区域,然后通过OCR进行数字识别该区域的截图即可得到身份证号码。感兴趣的可以了解一下
    2021-12-12
  • C++面试八股文之如何避免死锁详解

    C++面试八股文之如何避免死锁详解

    在C++中,锁(Lock)是一种同步工具,用于保护共享资源,防止多个线程同时访问,那么如何避免死锁的情况出现呢,下面就为大家简单讲讲
    2023-07-07
  • Matlab实现灰色预测的示例代码

    Matlab实现灰色预测的示例代码

    这篇文章主要为大家详细介绍了如何利用Matlab实现灰色预测,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以了解一下
    2022-05-05

最新评论