美文网首页编程语言
面向对象程序设计-运算符重载(2020-04-06)

面向对象程序设计-运算符重载(2020-04-06)

作者: _NewMoon | 来源:发表于2020-04-06 21:07 被阅读0次

当运算符作用于类类型的运算对象时,可以通过运算符重载重新定义该运算符的含义,合适的使用运算符重载可以提高代码的可读性!

运算符重载

重载运算符函数的参数数量于该运算符作用的运算对象数量一样多,但若该运算符重载函数是成员函数,则它的第一个运算对象绑定到this指针上,所以成员运算符函数的(显式)参数数量比运算对象的数量少一个。

Tips:
  • 1.对于一个运算符重载函数来说,它的运算对象不能全是内置类型,因为这样会导致原来正确的运算式不能得到正确的运算(二义性)。
  • 2.只能重载已有的运算符,不能发明新的运算符号。
  • 3.部分运算符不能被重载,见下图 :


    P1
  • 4.某些运算符不应该被重载(尽管它们被可以重载):逻辑与,逻辑或和逗号运算符,因为它们的运算对象求值顺序规则重载后不能被保留下来看,并且对"||""&&"来说,重载版本无法保留它们的短路求值属性。

成员函数还是非成员函数

当我们定义重载的运算符时,需要考虑是将其声明为类的成员函数还是非成员函数,下面给出《C++Primer》上给出的判断准则:

  • 1.赋值("=")、小标("[ ]")、调用("()")和成员访问箭头("->")运算符必须是成员。
  • 2.复合赋值运算符一般来说应该是成员,但并非必须,这一点与赋值运算符略有不同。
  • 3.改变对象状态的运算符或者与给定类型密切相关的运算符,如递增、递减和解引用运算符,通常应该是成员。
  • 4.具有对称性的运算符可能转换为任意一端的运算对象,例如算术、相等性、关系和位运算符等,因此它们通常应该是普通的非成员函数。

下面通过重载输入输出运算符来熟悉一下上面的内容:

重载输入输出运算符

#include <iostream>

using namespace std;

class Sales_data{
private:
    int a,b,c;
    //输出一个对象的数据成员不会改变对象的状态,所以这里用const Sales_data&
    friend ostream &operator<<(ostream &os,const Sales_data& a);
    //输入的值会改变对象的数据成员,所以这里不用const
    friend istream &operator>>(istream &is,Sales_data& a);
public:
    Sales_data():a(0),b(0),c(0){};
    Sales_data(int a,int b,int c):a(a),b(b),c(c){};
    ~Sales_data(){cout<<"~Sales_data"<<endl;}
};
ostream &operator<<(ostream &os,const Sales_data& a){
    os<<a.a<<" "<<a.b<<" "<<a.c<<endl;
    return os;
}
istream &operator>>(istream &is, Sales_data &a){
    int t;
    is >> a.a>>a.b>>t;
    //这个if语句用来检查输入是否成功
    if(is)
        a.c = a.a + a.b + t;
    //如果不成功,对象被赋予默认的状态
    else
        a = Sales_data();
}

int main()
{
    Sales_data b(1,2,3);
    cin>>b;
    cout<<b;
    return 0;
}

对于上面这段代码,我们可以看出,输入输出运算符必须是非成员函数,这两个运算符重载函数的第一个参数都是非常量流的引用,另外,它们都访问了Sales_data对象的私有成员,所以我们需要将它们声明为友元

相关文章

  • 面向对象程序设计-运算符重载(2020-04-06)

    当运算符作用于类类型的运算对象时,可以通过运算符重载重新定义该运算符的含义,合适的使用运算符重载可以提高代码的可读...

  • php 属性重载与方法重载

    本文实例讲述了PHP面向对象程序设计重载(overloading)操作。分享给大家供大家参考,具体如下: 重载 P...

  • JVM方法调用

    方法重载和方法重写多态是面向对象程序设计的重要特性,方法重载和方法重写是Java语言实现多态的主要形式。方法重载指...

  • 面向对象编程初探

    面向对象程序设计:Object-oriented programming(OOP) 逻辑运算符的知识: 且(&&)...

  • 面向对象 -- 运算符重载

    对于数字类型可以直接进行加、减、乘、除等运算,但对于自定义类型,其运算规则需要自己设计,在python中运算规则通...

  • Java技术栈梳理

    Java语言 基础, 基本类型, 操作符, 运算符, 表达式 面向对象, 类, 继承, 多态, 重写, 重载 S...

  • C++<第二十六篇>:重载运算符

    重载运算符可以完成对象和对象之间的运算,同样也可以通过重载运算符运算实现对象和普通类型数据的运算。 (1)重载运算...

  • 【C++】面向对象之类和对象(下篇)-004

    第四章 类和对象 4.6 运算符重载 4.6.1 运算符重载基本概念 运算符重载,就是对已有的运算符重新进行定义,...

  • 第四章 对象与类

    1 面向对象程序设计概述 面向对象程序设计(简称OOP)是当今主流的程序设计范型 Java是完全面向对象的,必须熟...

  • 运算符重载与友元函数

    运算符重载 C++允许将运算符重载到用户定义的类型,例如,使用+将两个类对象相加。 重载运算符要使用运算符函数: ...

网友评论

    本文标题:面向对象程序设计-运算符重载(2020-04-06)

    本文链接:https://www.haomeiwen.com/subject/xrbvphtx.html