zoukankan      html  css  js  c++  java
  • 基本概念

    重载的运算符是具有特殊名字的函数:它们的名字由关键字 operator 和其后要定义的运算符号共同组成,和其他函数一样,重载的运算符也包含返回类型、参数列表以及函数体。

    重载运算符函数的参数数量与该运算符作用的运算对象一样多。如果一个运算符函数是成员函数,则它的第一个运算对象绑定到隐式的 this 指针上,因此,成员运算符函数的显式参数数量要比运算符的运算对象总数少一个。

    对于一个运算符函数来说,它或者是类的成员,或者至少含有一个类类型的参数:

    int operator+(int,int); //错误,不能为int重定义内置的运算符
    

    只能重载已有的运算符,不能发明新的运算符。

    +,-,*,& 既是一元运算符也是二元运算符,所有这些运算符都可以被重载,从参数的数量可以推断出到底定义的是那种运算符。

    对于一个重载的运算符来说,其优先级和结合律与对应的内置运算符保持一致。

    直接调用一个重载的运算符函数

    间接调用重载的运算符和直接调用重载的运算符:

    data1 + data2;			//普通的表达式
    operator+(data1,data2);	//等价的函数调用
    

    这两次调用是等价的,它们都调用了非成员函数 operator+

    间接和直接调用成员函数:

    data1 += data2;				//基于调用的表达式
    data1.operator += (data2);	//对成员运算符函数的等价调用
    

    某些运算符不应该被重载

    通常情况下,不应该重载逗号,取地址,逻辑与,逻辑或运算符。

    重载之后,逻辑与,逻辑或,逗号运算符的求值顺序规则无法保留下来。除此之外,逻辑与和逻辑或运算符的重载版本也无法保留内置运算符的短路求值属性,两个运算对象总是会被求值。

    C++语言已经定义了取地址运算符和逗号运算符用于类类型对象时的特殊含义,因为这两个运算符已经有了内置的含义,所以一般不应该重载它们,否则它们的行为将异于常态。

    使用与内置类型一致的含义

    • 如果类执行 IO 操作,则定义移位运算符使其与内置类型的 IO 保持一致。
    • 如果类的某个操作是检查相等性,则定义 operator==;如果类有了 operator== 那么意味着也应该有operator!=
    • 如果类包含一个内在的单序比较操作,则定义 operator<;如果类有了 operator<,则它也应该还有其它关系操作。
    • 重载运算符的返回类型通常情况下应该与内置版本的返回类型兼容:逻辑运算符合关系运算符应该返回 bool,算术运算符应该返回一个类类型的值,赋值运算符和复合赋值运算符应该返回左侧运算对象的一个引用。

    选择作为成员或非成员

    • 赋值=、下标[]、调用()、和成员箭头->运算符必须是成员。
    • 复合赋值运算符一般来说应该是成员,但并非必须,这一点与赋值运算符略有不同。
    • 改变对象状态的运算符或者与给定类型密切相关的运算符,如递增、递减和解引用运算符通常应该是成员。
    • 具有对称性的运算符可能转换任意一端的运算对象,例如算术,相等性,关系和位运算符等,因此它们通常应该定义成普通的非成员函数。
  • 相关阅读:
    Java设计模式之行为型模式(观察者模式)
    Java设计模式之行为型模式(备忘录模式)
    Java设计模式之行为型模式(中介者模式)
    Java设计模式之行为型模式(迭代器模式)
    javascript 函数声明和函数表达式的区别(学习笔记)
    javascript Array Methods(学习笔记)
    工作记录
    redis
    vue prop属性
    读vue源码笔记(1)
  • 原文地址:https://www.cnblogs.com/xiaojianliu/p/12496372.html
Copyright © 2011-2022 走看看