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

 更新时间:2020年4月25日 17:44  点击:1468

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

(2)C++允许重载的运算符
C++中绝大部分运算符都是可以被重载的。

不能重载的运算符只有5个:

.             (成员访问运算符)

.*            (成员指针访问运算符)

::             (域运算符)

sizeof    (长度运算符)

?:            (条件运算符)

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

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

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

(5)重载不能改变运算符的结合性。
如,复制运算符”=“是右结合性(自右至左),重载后仍为右结合性。

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

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

复制代码 代码如下:

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

原来运算符+的作用是对两个数相加,现在企图通过重载使它的作用改为两个数相减。

如果允许这样重载的话,如果有表达式4+3,它的结果是7还是1呢?显然,这是绝对要禁止的。

(8)用于类对象的运算符一般必须重载,但有两个例外,运算符”=“和运算符”&“不必用户重载。
复制运算符”=“可以用于每一个类对象,可以用它在同类对象之间相互赋值。因为系统已为每一个新声明的类重载了一个赋值运算符,它的作用是逐个复制类中的数据成员

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

(9)应当使重载运算符的功能类似于该运算符作用于标准类型数据时候时所实现的功能。
例如,我们会去重载”+“以实现对象的相加,而不会去重载”+“以实现对象相减的功能,因为这样不符合我们对”+“原来的认知。

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

[!--infotagslink--]

相关文章

  • 基于C#方法重载的总结详解

    本篇文章是对C#中方法重载进行了详细的分析介绍,需要的朋友参考下...2020-06-25
  • C#中重载与重写区别分析

    这篇文章主要为大家详细介绍了C#中重载与重写的区别,感兴趣的小伙伴们可以参考一下...2020-06-25
  • C#运算符重载用法实例分析

    这篇文章主要介绍了C#运算符重载用法,实例分析了C#中运算符重载的基本实现与使用技巧,需要的朋友可以参考下...2020-06-25
  • C++填坑的重写,重载和隐藏的详解

    这篇文章主要介绍了C++中重载、重写(覆盖)和隐藏的区别,是C++面向对象程序设计非常重要的概念,需要的朋友可以参考下,希望能够给你带来帮助...2021-09-18
  • 下标操作符重载模拟多维数组详解

    虽然不能直接实现一对下标操作符重载,但是我们可以间接模拟。思路是这样的,先通过单下标操作返回一个具有下标操作能力的左值,对左值进行下标操作,两个下标操作表达式联立就实现了双下标操作...2020-04-25
  • python 模块重载的五种方法

    这篇文章主要介绍了python 模块重载的五种方法,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-04-23
  • C++实践Time类中的运算符重载参考方法

    今天小编就为大家分享一篇关于C++实践Time类中的运算符重载参考方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...2020-04-25
  • C#中多态、重载、重写区别分析

    这篇文章主要介绍了C#中多态、重载、重写区别,采用实例较为通俗易懂的分析了多态、重载的重写的概念与用法,对于C#初学者有非常不错的借鉴价值,需要的朋友可以参考下...2020-06-25
  • 浅谈java中的重载和重写的区别

    本文主要介绍了java中的重载和重写的区别。具有一定的参考价值,下面跟着小编一起来看下吧,希望能够给你带来帮助...2021-11-02
  • C++中的四个默认成员函数与运算符重载详解

    这篇文章主要给大家介绍了关于C++中四个默认成员函数与运算符重载的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来跟着小编一起学习学习吧。...2020-04-25
  • C++中构造函数重载

    这篇文章主要介绍了C++中构造函数重载的相关资料,十分的详细,需要的朋友可以参考下...2020-04-25
  • 浅谈C++重载、重写、重定义

    下面小编就为大家带来一篇浅谈C++重载、重写、重定义。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
  • C++函数重载的深入解析

    在C++中,我们也能够把具有相同功能的函数整合到一个函数上,而不必去写好多个函数名不同的函数,这叫做函数的重载。以下是对C++中的函数重载进行了详细的分析介绍,需要的朋友可以过来参考下...2020-04-25
  • 简介C++编程中的运算符重载

    这篇文章简单介绍了C++编程中的运算符重载,是C++入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
  • C++之CNoTrackObject类和new delete操作符的重载实例

    这篇文章主要介绍了C++之CNoTrackObject类和new delete操作符的重载实例,是C++程序设计中比较重要的概念,需要的朋友可以参考下...2020-04-25
  • C++输入输出操作符重载的深入分析

    本篇文章是对C++输入输出操作符重载进行了详细的分析介绍,需要的朋友参考下...2020-04-25
  • 详细分析c# 运算符重载

    这篇文章主要介绍了c# 运算符重载的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-20
  • C++运算符重载 成员函数与友元函数详解

    以下是对C++运算符重载 成员函数与友元函数进行了介绍,需要的朋友可以过来参考下...2020-04-25
  • C++函数重载详解及实例代码

    这篇文章主要介绍了C++函数重载详解及实例代码的相关资料,需要的朋友可以参考下...2020-04-25
  • C++中的重载、覆盖、隐藏介绍

    这篇文章主要介绍了C++中的重载、覆盖、隐藏介绍,需要的朋友可以参考下...2020-04-25