zoukankan      html  css  js  c++  java
  • 《新标准C++程序设计》4.1(C++学习笔记12)

    运算符重载的概念和原理

     

    一、运算符重载的需求

    C++预定义的“+、-、 * 、/、%、 ^ 、&、~、!、|、 = 、<< >>、!= ”等运算符,只能用于基本数据类型(整型、实型、字符型、逻辑型)的常量或变量进行运算,不能用于对象之间的运算。

    在数学上,两个复数可以直接进行+、-等运算。但在C++中,直接将+或-用于复数对象是不允许的。有时会希望,让对象也能通过运算符进行运算。这样代码更简洁,容易理解。

     

    二、运算符重载

    运算符重载,就是对已有的运算符(C++中预定义的运算符)赋予多重的含义,使同一运算符作用于不同类型的数据时导致不同类型的行为。

    运算符重载的目的是:扩展C++中提供的运算符的适用范围,使之能作用于对象。

    同一个运算符,对不同类型的操作数,所发生的行为不同。

     

    三、运算符重载的形式

    运算符重载的实质是函数重载

    可以重载为普通函数,也可以重载为成员函数

    把含运算符的表达式转换成对运算符函数的调用。

    把运算符的操作数转换成运算符函数的参数。

    运算符被多次重载时,根据实参的类型决定调用哪个运算符函数。

    运算符函数的格式

    返回值类型 operator 运算符(形参表)
    {
       ……
    }

    程序示例分析:

    #include<iostream>
    using namespace std;
    class Complex
    {
    public:
        double real, imag;
        Complex(double r = 0.0, double i = 0.0) :real(r), imag(i) { }
        Complex operator-(const Complex& c);
    };
    Complex operator+(const Complex& a, const Complex& b)
    {
        return Complex(a.real + b.real, a.imag + b.imag);      //返回一个临时对象
    }
    Complex Complex::operator-(const Complex& c)
    {
        return Complex(real - c.real, imag - c.imag);          //返回一个临时对象
    }
    int main()
    {
        Complex a(4, 4), b(1, 1), c;
        c = a + b;                                             //等价于c=operator+(a,b);
        cout << c.real << "," << c.imag << endl;
        cout << (a - b).real << "," << (a - b).imag << endl;   //a-b等价于a.operator-(b)
        return 0;
    }

    输出结果:

    5,5
    3,3

    Tips:

    重载为成员函数时,参数个数为运算符目数减一。

    重载为普通函数时,参数个数为运算符目数。

    “类名(构造函数实参表)”这种写法表示生成一个临时对象。

  • 相关阅读:
    LCS LIS
    补个线段树
    洛谷1522
    AC自动机
    WF 2017 I
    WF2017 E
    最小生成树计数 基尔霍夫矩阵树定理
    bitonic tour luogu1523
    code+11月月赛
    模拟退火
  • 原文地址:https://www.cnblogs.com/cyn522/p/12290931.html
Copyright © 2011-2022 走看看