首页 > 其他 > 详细

运算符重载

时间:2021-06-08 13:34:53      阅读:21      评论:0      收藏:0      [点我收藏+]

一.运算符重载

双目运算符 + - * / = == != > < >= <=
重载时候,参数列表中第一个参数再运算符左侧,第二个参数在运算符右侧


单目 ++ --
运算符重载时候 区分前后置
前置参数列表为空(this指针除外)
后置参数列表加上 int

#include<iostream>
#include<iostream>
using namespace std;
#if 0
/*
运算符的重载

int a,b;

a+b
a>b   a<b
a+=b
a==b
a!=b

a++
++a
a--
--a

FuN   a1(int,int)
int a2 = 10;
FuN a3 = a1+a2;

cout<<a<<endl;
cin>>a;

class FuN
{
    int _a;
    int _bi;
};

a = 1+3i
b = 3+2i

a+b = 4+5i

*/

class FuN
{
private:
    int _a;
    int _bi;

public:
    FuN(int a, int b)
    {
        _a = a;
        _bi = b;
    }

    FuN(const FuN& src)//&:防止循环引用
    {
        _a = src._a;
        _bi = src._bi;
    }

    void show()
    {
        cout << "number=" << _a << "+" << _bi << "i" << endl;
    }

    //=
    void operator=(/*this,*/const FuN& src)//重载:operator后是什么就重载什么,等号重载
    {
        this->_a = src._a;
        this->_bi = src._bi;
    }

    //>
    bool operator>(/*this*/const FuN& num)//*this > num
    {
        if (this->_a > num._a)
        {
            return true;
        }
        else if (this->_a < num._a)
        {
            return false;
        }
        else if (this->_bi > num._bi)//数学中虚部不能比较大小
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    //+
    FuN operator+(/*this,*/int a)//*this+a   
    {
        return FuN(_a + a, _bi);
    }

    //FuN operator+(this)

    //前置++  参数列表为空(除开this指针)
    FuN& operator++()   //++(*this)   //解引用this 返回为自身  这种情况加&(引用)
    {
        _a++;
        _bi++;
        return *this;
    }

    //后置++   参数别表中加入int
    FuN operator++(int)//int为标志
    {
        FuN tmp(_a, _bi);
        _a++;
        _bi++;
        return tmp;
    }

    //输出运算符  <<        cout<<a
    void operator<<(/*this,*/ostream& out)
    {
        out << _a << "+" << _bi << "i" << endl;
    }

    //输入运算符
    void operator>>(istream& in)
    {
        in >> _a;
        in >> _bi;
    }

    friend FuN operator+(int a, const FuN& n);
    friend ostream& operator<<(ostream& out, const FuN& n);
    friend istream& operator>>(istream& in, FuN& n);
};

ostream& operator<<(ostream& out, const FuN& n)
{
    out << n._a << "+" << n._bi << "i" << endl;
    return out;
}

istream& operator>>(istream& in, FuN& n)
{
    in >> n._a;
    in >> n._bi;
    return in;
}
//输出流对象类型是  ostream    输出流对象 cout
//输入流对象类型是  istream    输入流对象 cin



FuN operator+(int a, const FuN& n)
{
    return FuN(n._a + a, n._bi);
}

二.大数运算

#pragma once
#ifndef BIG_NUM_H
#define BIG_NUM_H
#include<vector>
#include<iostream>
#include<string>
using namespace std;

class BigNum
{
private:
    int _tag;//-1   负数    +1 正数
    vector<int> _vec;
    int a;
    int b;
        
    int char_to_int(char c);

    vector<int> sum(const vector<int>& a, const vector<int>& b);
    vector<int> sub(const vector<int>& a, const vector<int>& b, int& tag);
public:
    BigNum();//空构造函数
    BigNum(const string& str);
    BigNum(const BigNum& src);


    BigNum operator=(const BigNum& src);//等号运算符重载
    BigNum operator=(const string& src);
    BigNum operator+(const BigNum& src);
    BigNum operator-(const BigNum& src);
    BigNum operator==(const BigNum& src);
    BigNum operator!=(const BigNum& src);
    BigNum operator++();
    BigNum operator++(int);
    BigNum operator>(const BigNum& src);
    BigNum operator<(const BigNum& src);
};


#endif

大数运算的实现:

#include"bignum.h"

BigNum::BigNum() :_tag(1) {}
BigNum::BigNum(const string& str)
{
    if (0 == str.size())
    {
        return;
    }

    str[0] == - ? _tag = -1 : _tag = 1;

    for (int i = str.size() - 1; i >= 0; i--)
    {
        if (str[i] == -)
        {
            continue;
        }
        int a = char_to_int(str[i]);
        if (a == -1)
        {
            cout << "error" << endl;
            break;
        }
        _vec.push_back(a);
    }

    while (_vec.back() == 0)
    {
        _vec.pop_back();
    }

}
BigNum::BigNum(const BigNum& src)//拷贝构造
    :_vec(src._vec)
{
    _tag = src._tag;
}

int BigNum::char_to_int(char c)
{
    int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
    char err[] = { 0,1,2,3,4,5,6,7,8,9 };
    for (int i = 0; i < sizeof(err); i++)
    {
        if (c == err[i])
        {
            return arr[i];
        }
    }
    return -1;
}

vector<int> BigNum::sum(const vector<int>& a, const vector<int>& b)
{
    int val;
    int tmp = 0;
    int i;
    vector<int> vec;
    for (i = 0; i < a.size() && i < b.size(); i++)
    {
        val = a[i] + b[i] + tmp;
        tmp = val / 10;
        val = val % 10;
        vec.push_back(val);
    }

    if (a.size() == b.size())
    {
        if (tmp != 0)
        {
            vec.push_back(tmp);
        }
        return vec;
    }
    const vector<int>* p;
    a.size() < b.size() ? p = &b : p = &a;

    for (; i < p->size(); i++)
    {
        val = (*p)[i] + tmp;
        tmp = val / 10;
        val = val % 10;
        vec.push_back(val);
    }
    if (tmp != 0)
    {
        vec.push_back(tmp);
    }

    return vec;
}

vector<int> BigNum::sub(const vector<int>& a, const vector<int>& b, int& tag)
{
    vector<int> vec;
    if (b.size() > a.size())
    {
        vec = sub(b, a, tag);
        _tag = -1;
        return;
    }
    if (b.size() == a.size())
    {
        for (int i = a.size() - 1; i >= 0; i--)
        {
            if (a[i] < b[i])
            {
                vec = sub(b, a, tag);
                _tag = -1;
                return;
            }
            else if (a[i] > b[i])
            {
                break;
            }
        }
    }
    int val1;
    int val2;
    int tmp = 0;
    int i = 0;


    for (; i < a.size() && i < b.size(); i++)
    {
        if (a[i] + tmp < b[i])
        {
            val1 = a[i] + 10 + tmp;
            tmp = -1;
        }
        else
        {
            val1 = a[i] + tmp;
            tmp = 0;
        }
        val2 = val1 - b[i];
        vec.push_back(val2);
    }
    if (a.size() == b.size())
    {
        if (tmp != 0)
        {
            vec.push_back(1);
            tag = -1;
        }
    }
    const vector<int>* p;
    a.size() < b.size() ? p = &b : p = &a;
    for (; i < p->size(); i++)
    {
        if ((*p)[i] + tmp < 0)
        {
            val1 = (*p)[i] + 10 + tmp;
            tmp = -1;
        }
        else
        {
            val1 = (*p)[i] + tmp;
            tmp = 0;
        }
        vec.push_back(val1);
    }
}

BigNum BigNum::operator=(const BigNum& src)
{
    _tag = src._tag;
    _vec = src._vec;
    return*this;
}

BigNum BigNum::operator=(const string& src)
{
    BigNum tmp(src);
    _tag = tmp._tag;
    _vec = tmp._vec;
}

BigNum BigNum::operator+(const BigNum& src)
{
    vector<int> tmp;
    int tag;
    if (_tag == -1 && src._tag == -1)
    {
        tmp = sum(_vec, src._vec);
        tag = -1;
    }
    if (_tag == 1 && src._tag == -1)
    {
        tmp = sub(_vec, src._vec, tag);
    }
    if (_tag == -1 && src._tag == 1)
    {
        tmp = sub(src._vec, _vec, tag);
    }
    if (_tag == 1 && src._tag == 1)
    {
        tmp = sum(_vec, src._vec);
        tag = 1;
    }

    BigNum num_tmp;
    num_tmp._tag = tag;
    num_tmp._vec = tmp;

    return num_tmp;
}

BigNum BigNum::operator-(const BigNum& src)
{
    vector<int> tmp;
    int tag;
    if (_tag == -1 && src._tag == -1)
    {
        tmp = sub(src._vec, _vec, tag);
    }
    if (_tag == 1 && src._tag == -1)
    {
        tmp = sum(_vec, src._vec);
        tag = 1;
    }
    if (_tag == -1 && src._tag == 1)
    {
        tmp = sum(src._vec, _vec);
        tag = -1;
    }
    if (_tag == 1 && src._tag == 1)
    {
        tmp = sub(_vec, src._vec, tag);
    }

    BigNum num_tmp;
    num_tmp._tag = tag;
    num_tmp._vec = tmp;

    return num_tmp;
}

BigNum BigNum::operator==(const BigNum& src)
{
    if (this == &src)
        return *this;
        
}
BigNum BigNum::operator!=(const BigNum& src)
{
    if (this != &src)
        return src;
}
BigNum BigNum::operator++()
{
    a++;
    return *this;
}
BigNum BigNum::operator++(int) 
{
    BigNum tmp(a, b);
    a++;
    b++;
    return tmp;
}
BigNum BigNum::operator>(const BigNum& src) 
{
    if (this>&src )
    {
        return *this ;
    }
    else 
    {
        return src;
    }

}
BigNum BigNum::operator<(const BigNum& src) 
{
    if (this < &src)
    {
        return *this;
    }
    else
    {
        return src;
    }
}

三.mystring的实现

成员方法的const
成员方法中如果确定不会改变对象中的成员 就给成员方法加上const

如果不确定是否会改变成员,或者对外提供了改变的途径,
就需要实现const和非const的

 

参数的const
如果参数传入是指针或者引用,且保证不会再函数中改变,就加上const


返回值的const
返回的如果是引用或者指针,且不希望被外界改变,就加上const

 

运算符重载

原文:https://www.cnblogs.com/xpei-1124/p/14861687.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!