• C++重载运算符的规则


    重载运算符的规则

    C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。C++中绝大部分的运算符允许重载,例如:

    +  -  *  /  %  ^  &  |  ~  !  =  <  >  +=  -=  *=  /=  %=  ^=  &=  |=  <<  >>  <<=  >>=  ==  !=  <=  >=  &&  ||  ++  --  ,  ->*  ->  ()  []

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

    1. . --- (成员访问运算符)
    2. .* --- (成员指针访问运算符)
    3. :: --- (域运算符)
    4. sizeof --- (长度运算符)
    5. ?: --- (条件运算符)

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

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

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

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

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

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

    int operator +(int a, int b)

    {

    return (a - b);

    }

    原来C/C++提供运算符 + 的作用是对两个数相加,那么,上面对运算符+进行重载,企图通过重载使它的作用改为两个数相减。如果允许这样重载的话,如果有表达式 4 + 3,它的结果是执行 (4 - 3) = 1的结果,那么,与常规的加法算术运算不同,这是不允许的。

    所以,重载运算符,操作的参数类型,不能够完全都是C/C++语法已经定义的数据类型,否则,就是修改了C/C++语法定义的运算符操作规则。

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

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

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

    从理论上来说,可以将一个运算符重载为执行任意的操作,只要我们在重载的运算符函数中自己写代码操作就可以了。


    韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发

  • 相关阅读:
    GJB 5000B简介
    Template serialization - shared_ptr<class T>
    C# FileSystemWatcher 多文件夹、多文件类型文件监控增加、修改、重命名和删除实例
    Java:谁是Java开发人员?这个职业现在很抢手吗?
    数据库的隔离级别有哪些?
    梳理Langchain-Chatchat-UI接口文档
    基于SpringBoot实现自动装配返回属性
    Java 基于SpringBoot的某家乡美食系统
    linux系统配置Samba实现与Windows系统的文件共享
    spring-cloud-gateway服务网关学习
  • 原文地址:https://blog.csdn.net/feng19870412/article/details/127523320