双目运算符 + - * / = == != > < >= <=
重载时候,参数列表中第一个参数再运算符左侧,第二个参数在运算符右侧
单目 ++ --
运算符重载时候 区分前后置
前置参数列表为空(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