操作符重载(复数类、数组类、函数对象)

目录

操作符重载与复数类

数组操作符的重载

函数调用操作符


操作符重载与复数类

C++中的重载能够以特殊形式的函数的扩展操作符的功能 ,通过operator关键字可以定义特殊的函数 ,operator的本质是通过函数重载操作符 

Type operator Sign(const Type& p1, const Type& p2)   
{  
    Type ret;  
      
    return ret;  
}
// Sign为系统中预定义的操作符,如:+,-,*,/,new,delete等 

复数类的实现

#include <stdio.h>

class Complex
{
    int a;
    int b;
public:
    Complex(int a = 0, int b = 0)
    {
        this->a = a;
        this->b = b;
    }

    int getA()
    {
        return a;
    }

    int getB()
    {
        return b;
    }

    friend Complex Add(const Complex& p1, const Complex& p2);

    friend Complex operator + (const Complex& p1, const Complex& p2);
};

Complex Add(const Complex& p1, const Complex& p2)
{
    Complex ret;

    ret.a = p1.a + p2.a;
    ret.b = p1.b + p2.b;

    return ret;
}

Complex operator + (const Complex& p1, const Complex& p2)
{
    Complex ret;

    ret.a = p1.a + p2.a;
    ret.b = p1.b + p2.b;

    return ret;
}

int main()
{
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = Add(c1, c2);
    Complex c4 = c1 + c2; // --> operator + (c1, c2)

    printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
    printf("c4.a = %d, c4.b = %d\n", c4.getA(), c4.getB());

    return 0;
}

可以将操作符重载函数定义为类的成员函数 ,比全局操作符重载函数少—个参数(左操作数),不需要依赖友元就可以完成操作符重载 ,编译器优先在成员函数中寻找操作符重载函数

 C++规定赋值操作符(=)只能重载为成员函数 ,操作符重载不能改变原操作符的优先级 ,操作符重载不能改变操作数的个数 ,操作符重载不应改变操作符的原有语义 

#include <stdio.h>  
  
class Complex   
{  
    int a;  
    int b;  
public:  
    Complex(int a = 0, int b = 0)  
    {  
        this->a = a;  
        this->b = b;  
    }  
      
    int getA()  
    {  
        return a;  
    }  
      
    int getB()  
    {  
        return b;  
    }  
      
    Complex operator + (const Complex& p)  
    {  
        Complex ret;  
        printf("Complex operator + (const Complex& p)\n");  
        ret.a = this->a + p.a;  
        ret.b = this->b + p.b;  
          
        return ret;  
    }  
      
    friend Complex operator + (const Complex& p1, const Complex& p2);  
};  
  
Complex operator + (const Complex& p1, const Complex& p2)  
{  
    Complex ret;  
    printf("Complex operator + (const Complex& p1, const Complex& p2)\n");  
    ret.a = p1.a + p2.a;  
    ret.b = p1.b + p2.b;  
      
    return ret;  
}  
  
int main()  
{  
    Complex c1(1, 2);  
    Complex c2(3, 4);  
    Complex c3 = c1 + c2; // c1.operator + (c2)  
      
    printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());  
      
    return 0;  
} 

 

完善的复数类

Complex.h

#ifndef _COMPLEX_H_  
#define _COMPLEX_H_  
  
class Complex  
{  
    double a;  
    double b;  
public:  
    Complex(double a = 0, double b = 0);  
    double getA();  
    double getB();  
    double getModulus();  
      
    Complex operator + (const Complex& c);  
    Complex operator - (const Complex& c);  
    Complex operator * (const Complex& c);  
    Complex operator / (const Complex& c);  
      
    bool operator == (const Complex& c);  
    bool operator != (const Complex& c);  
      
    Complex& operator = (const Complex& c);  
};  
  
#endif 

 Complex.cpp

#include "Complex.h"  
#include "math.h"  
  
Complex::Complex(double a, double b)  
{  
    this->a = a;  
    this->b = b;  
}  
  
double Complex::getA()  
{  
    return a;  
}  
  
double Complex::getB()  
{  
    return b;  
}  
  
double Complex::getModulus()  
{  
    return sqrt(a * a + b * b);  
}  
  
Complex Complex::operator + (const Complex& c)  
{  
    double na = a + c.a;  
    double nb = b + c.b;  
    Complex ret(na, nb);  
      
    return ret;  
}  
  
Complex Complex::operator - (const Complex& c)  
{  
    double na = a - c.a;  
    double nb = b - c.b;  
    Complex ret(na, nb);  
      
    return ret;  
}  
  
Complex Complex::operator * (const Complex& c)  
{  
    double na = a * c.a - b * c.b;  
    double nb = a * c.b + b * c.a;  
    Complex ret(na, nb);  
      
    return ret;  
}  
  
Complex Complex::operator / (const Complex& c)  
{  
    double cm = c.a * c.a + c.b * c.b;  
    double na = (a * c.a + b * c.b) / cm;  
    double nb = (b * c.a - a * c.b) / cm;  
    Complex ret(na, nb);  
      
    return ret;  
}  
      
bool Complex::operator == (const Complex& c)  
{  
    return (a == c.a) && (b == c.b);  
}  
  
bool Complex::operator != (const Complex& c)  
{  
    return !(*this == c);  
}  
      
Complex& Complex::operator = (const Complex& c)  
{  
    if( this != &c )  
    {  
        a = c.a;  
        b = c.b;  
    }  
      
    return *this;  
} 

main.cpp

#include <stdio.h>  
#include "Complex.h"  
  
int main()  
{  
    Complex c1(1, 2);  
    Complex c2(3, 6);  
    Complex c3 = c2 - c1;  
    Complex c4 = c1 * c3;  
    Complex c5 = c2 / c1;  
      
    printf("c3.a = %f, c3.b = %f\n", c3.getA(), c3.getB());  
    printf("c4.a = %f, c4.b = %f\n", c4.getA(), c4.getB());  
    printf("c5.a = %f, c5.b = %f\n", c5.getA(), c5.getB());  
      
    Complex c6(2, 4);  
      
    printf("c3 == c6 : %d\n", c3 == c6);  
    printf("c3 != c4 : %d\n", c3 != c4);  
      
    (c3 = c2) = c1;  
      
    printf("c1.a = %f, c1.b = %f\n", c1.getA(), c1.getB());  
    printf("c2.a = %f, c2.b = %f\n", c2.getA(), c2.getB());  
    printf("c3.a = %f, c3.b = %f\n", c3.getA(), c3.getB());  
      
    return 0;  
}

  

数组操作符的重载

数组访问符是C/C++中的内置操作符 ,数组访问符的原生意义是数组访问和指针运算 

        

数组访问操作符( [ ] ) 

只能通过类的成员函数重载 ,重载函数能且仅能使用—个参数 ,可以定义不同参数的多个重载函数 

#include <iostream>  
#include <string>  
  
using namespace std;  
  
class Test  
{  
    int a[5];  
public:  
    int& operator [] (int i) 
    {  
        return a[i];  
    }  
      
    int& operator [] (const string& s)  
    {  
        if( s == "1st" )  
        {  
            return a[0];  
        }  
        else if( s == "2nd" )  
        {  
            return a[1];  
        }  
        else if( s == "3rd" )  
        {  
            return a[2];  
        }  
        else if( s == "4th" )  
        {  
            return a[3];  
        }  
        else if( s == "5th" )  
        {  
            return a[4];  
        }  
          
        return a[0];  
    }  
      
    int length()  
    {  
        return 5;  
    }  
};  
  
int main()  
{  
    Test t;  
      
    for(int i=0; i<t.length(); i++)  
    {  
        t[i] = i;  //返回引用的原因,返回的t.operator[](i)本身就为值,值赋值?
    }  
      
    for(int i=0; i<t.length(); i++)  
    {  
        cout << t[i] << endl;  
    }  
      
    cout << t["5th"] << endl;  
    cout << t["4th"] << endl;  
    cout << t["3rd"] << endl;  
    cout << t["2nd"] << endl;  
    cout << t["1st"] << endl;  
      
    return 0;  
}  

                        

数组类的实现

IntArray.h

#ifndef _INTARRAY_H_  
#define _INTARRAY_H_  
  
class IntArray  
{  
private:  
    int m_length;  
    int* m_pointer;  
      
    IntArray(int len);  
    IntArray(const IntArray& obj);  
    bool construct();  
public:  
    static IntArray* NewInstance(int length);   
    int length();  
    bool get(int index, int& value);  
    bool set(int index ,int value);  
    int& operator [] (int index);  
    IntArray& operator = (const IntArray& obj);  
    IntArray& self();  
    ~IntArray();  
};  
  
#endif 

 IntArray.cpp

#include "IntArray.h"  
  
IntArray::IntArray(int len)  
{  
    m_length = len;  
}  
  
bool IntArray::construct()  
{  
    bool ret = true;  
      
    m_pointer = new int[m_length];  
      
    if( m_pointer )  
    {  
        for(int i=0; i<m_length; i++)  
        {  
            m_pointer[i] = 0;  
        }  
    }  
    else  
    {  
        ret = false;  
    }  
      
    return ret;  
}  
  
IntArray* IntArray::NewInstance(int length)   
{  
    IntArray* ret = new IntArray(length);  
      
    if( !(ret && ret->construct()) )   
    {  
        delete ret;  
        ret = 0;  
    }  
          
    return ret;  
}  
  
int IntArray::length()  
{  
    return m_length;  
}  
  
bool IntArray::get(int index, int& value)  
{  
    bool ret = (0 <= index) && (index < length());  
      
    if( ret )  
    {  
        value = m_pointer[index];  
    }  
      
    return ret;  
}  
  
bool IntArray::set(int index, int value)  
{  
    bool ret = (0 <= index) && (index < length());  
      
    if( ret )  
    {  
        m_pointer[index] = value;  
    }  
      
    return ret;  
}  
  
int& IntArray::operator [] (int index)  
{  
    return m_pointer[index];  
}  
  
IntArray& IntArray::operator = (const IntArray& obj)  
{  
    if( this != &obj )  
    {  
        int* pointer = new int[obj.m_length];  
          
        if( pointer )  
        {  
            for(int i=0; i<obj.m_length; i++)  
            {  
                pointer[i] = obj.m_pointer[i];  
            }  
              
            m_length = obj.m_length;  
            delete[] m_pointer;  
            m_pointer = pointer;  
        }  
    }  
      
    return *this;  
}  
  
IntArray& IntArray::self()  
{  
    return *this;  
}  
  
IntArray::~IntArray()  
{  
    delete[] m_pointer;  
}  

main.cpp

#include <iostream>  
#include <string>  
#include "IntArray.h"  
  
using namespace std;  
  
int main()  
{  
    IntArray* a = IntArray::NewInstance(5);      
      
    if( a != NULL )  
    {  
        IntArray& array = a->self();  
          
        cout << "array.length() = " << array.length() << endl;  
      
        array[0] = 1;  //(*a)[0]=1;工程中尽量避免指针
          
        for(int i=0; i<array.length(); i++)  
        {    
            cout << array[i] << endl;  
        }  
    }  
      
    delete a;  
      
    return 0;  
}  

 

函数调用操作符

使用具体的类对象取代函数 ,该类的对象具备函数调用的行为 ,函数调用操作符只能通过类的成员函数重载  ,可以定义不同参数的多个重载函数

函数对象用于在工程中取代函数指针

// 编写—个函数 ,函数可以获得斐波那契数列每项的值 ,每调用—次返回—个值 ,函数可根据需要重复使用
#include <iostream>  
  
using namespace std;  
  
class Fib  
{  
    int a0;  
    int a1;  
public:  
    Fib()  
    {  
        a0 = 0;  
        a1 = 1;  
    }  
      
    Fib(int n)  
    {  
        a0 = 0;  
        a1 = 1;  
          
        for(int i=2; i<=n; i++)  
        {  
            int t = a1;  
              
            a1 = a0 + a1;  
            a0 = t;  
        }  
    }  
      
    int operator () ()  
    {  
        int ret = a1;  
      
        a1 = a0 + a1;  
        a0 = ret;  
          
        return ret;  
    }  
};  
  
int main()  
{  
    Fib fib;  
      
    for(int i=0; i<10; i++)  
    {  
        cout << fib() << endl;  
    }  
      
    cout << endl;  
      
    for(int i=0; i<5; i++)  
    {  
        cout << fib() << endl;  
    }  
      
    cout << endl;  
      
    Fib fib2(10);  
      
    for(int i=0; i<5; i++)  
    {  
        cout << fib2() << endl;  
    }  
      
    return 0;  
} 

  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值