运算符重载2

来源:互联网 发布:电子数据交换业务 编辑:程序博客网 时间:2024/04/27 21:07
#ifndef BYTE_H#define BYTE_H#include <iostream>class Byte{unsigned char b;public:Byte(unsigned char bb = 0) : b(bb){}void print() const{std::cout << (int)b << std::endl;}const Byte& operator+() {std::cout << "+Byte\n";return *this;}const Byte operator-(){std::cout << "-Byte\n";return Byte(-b);}const Byte operator~(){std::cout << "~Byte\n";return Byte(~b);}Byte* operator&(){std::cout << "&Byte\n";return this;}int operator!(){std::cout << "!Byte\n";return !b; // 这个是逻辑非,返回是bool值,}const Byte& operator++()  // 这个是前++{std::cout << "前++Byte\n";b++;return *this;}const Byte operator++(int)  // 这个是后++{std::cout << "后++Byte\n";Byte before(b);b++;return before;}const Byte& operator--()  // 这个是前--{std::cout << "前--Byte\n";b--;return *this;}const Byte operator--(int)  // 这个是后--{std::cout << "后++Byte\n";Byte before(b);b--;return before;}const Byte operator+(const Byte& right) const{return Byte(b + right.b);}const Byte operator-(const Byte& right) const{return Byte(b - right.b);}const Byte operator*(const Byte& right) const{return Byte(b * right.b);}const Byte operator/(const Byte& right) const{return Byte(b / right.b);}const Byte operator&(const Byte& right) const{return Byte(b & right.b);}const Byte operator%(const Byte& right) const{return Byte(b % right.b);}const Byte operator^(const Byte& right) const{return Byte(b ^ right.b);}const Byte operator|(const Byte& right) const{return Byte(b | right.b);}const Byte operator<<(const Byte& right) const{return Byte(b << right.b);}const Byte operator>>(const Byte& right) const{return Byte(b >> right.b);}Byte& operator+=(const Byte& right){b += right.b;return *this;}Byte& operator-=(const Byte& right){b -= right.b;return *this;}int operator==(const Byte& right) const{return b == right.b;}Byte& operator=(const Byte& right)   // 赋值操作必须是成员函数,[]、()、->、->* 也都必须是成员函数,{if (this == &right) return *this;b = right.b;return *this;}};#endif

#ifndef INTEGER_H#define INTEGER_H#include <iostream>class Integer{long i;Integer* This() { return this; }public:Integer(long ii = 0) : i(ii){}void print() const{std::cout << i << std::endl;}friend const Integer& operator+(const Integer& a);friend const Integer operator-(const Integer& a);friend const Integer operator~(const Integer& a);friend Integer* operator&(Integer& a);friend int operator!(const Integer& a);friend const Integer& operator++(Integer& a);friend const Integer operator++(Integer& a, int);friend const Integer& operator--(Integer& a);friend const Integer operator--(Integer& a, int);friend const Integer operator+(const Integer& left, const Integer& right);friend const Integer operator-(const Integer& left, const Integer& right);friend const Integer operator*(const Integer& left, const Integer& right);friend const Integer operator/(const Integer& left, const Integer& right);friend const Integer operator%(const Integer& left, const Integer& right);friend const Integer operator^(const Integer& left, const Integer& right);friend const Integer operator&(const Integer& left, const Integer& right);friend const Integer operator|(const Integer& left, const Integer& right);friend const Integer operator<<(const Integer& left, const Integer& right);friend const Integer operator>>(const Integer& left, const Integer& right);friend Integer& operator+=(Integer& left, const Integer& right);friend Integer& operator-=(Integer& left, const Integer& right);friend int operator==(const Integer& left, const Integer& right);friend int operator<(const Integer& left, const Integer& right);};const Integer& operator+(const Integer& a) // 改变了,返回一个引用,{std::cout << "+Integer\n";return a;}const Integer operator-(const Integer& a){std::cout << "-Integer\n";return Integer(-a.i);  // 这个不是引用返回的是一个新的对象}const Integer operator~(const Integer& a){std::cout << "~Integer\n";return Integer(~a.i); // ~ 这个是按位取反,}Integer* operator&(Integer& a){std::cout << "&Integer\n";return a.This();}int operator!(const Integer& a){std::cout << "!Integer\n";return !a.i; // 这个是逻辑非,返回是bool值,}const Integer& operator++(Integer& a)  // 这个是前++{std::cout << "前++Integer\n";a.i++;return a;}const Integer operator++(Integer& a, int)  // 这个是后++{std::cout << "后++Integer\n";Integer before(a.i);a.i++;return before;}const Integer& operator--(Integer& a)  // 这个是前--{std::cout << "前--Integer\n";a.i--;return a;}const Integer operator--(Integer& a, int)  // 这个是后--{std::cout << "后++Integer\n";Integer before(a.i);a.i--;return before;}const Integer operator+(const Integer& left, const Integer& right) // 加法操作,{return Integer(left.i + right.i);}const Integer operator-(const Integer& left, const Integer& right) // 减法操作,{return Integer(left.i - right.i);}const Integer operator*(const Integer& left, const Integer& right) {return Integer(left.i * right.i);}const Integer operator/(const Integer& left, const Integer& right) {return Integer(left.i / right.i);}const Integer operator%(const Integer& left, const Integer& right){return Integer(left.i % right.i);}const Integer operator^(const Integer& left, const Integer& right) // 异或{return Integer(left.i ^ right.i);}const Integer operator&(const Integer& left, const Integer& right) // 位与{return Integer(left.i & right.i);}const Integer operator|(const Integer& left, const Integer& right) // 位或{return Integer(left.i | right.i);}const Integer operator<<(const Integer& left, const Integer& right){return Integer(left.i << right.i);}const Integer operator>>(const Integer& left, const Integer& right){return Integer(left.i >> right.i);}Integer& operator+=(Integer& left, const Integer& right){left.i += right.i;return left;}Integer& operator-=(Integer& left, const Integer& right){left.i -= right.i;return left;}int operator==(const Integer& left, const Integer& right){return left.i == right.i;}int operator<(const Integer& left, const Integer& right){return left.i < right.i;}#endif

#include <iostream>#include "integer.h"#include "Byte.h"using namespace std;class IntArray{enum { sz = 5 };int i[sz];public:IntArray() { memset(i, 0, sz*sizeof(*i)); } // memset 把分配的内存清零,int& operator[](int x) // 这个就是下标运算符重载,必须做成是成员函数,{return i[x];}~IntArray() {}friend ostream& operator<<(ostream& os, const IntArray& ia);friend istream& operator>>(istream& is, IntArray& ia);};ostream& operator<<(ostream& os, const IntArray& ia)  // ostream 是输出流,{for (int j = 0; j < ia.sz; j++){os << ia.i[j];if (j != ia.sz - 1)os << ", ";}os << endl;return os;}istream& operator>>(istream& is, IntArray& ia)  // istream 是输入流,{for (int j = 0; j < ia.sz; j++)is >> ia.i[j];return is;}void test66(){/*Integer in(80);Integer test;*/Byte in(80);Byte test;test = +in;test.print();test = -in;test.print();test = ~in;test.print();//Integer *ip = ∈ // 指针的地址,Byte *ip = ∈cout << ip << endl;int r = !in;cout << r << endl;in.print(); // 80++in;in.print(); // 81test = in++;test.print(); // 81in.print();  // 82--in;in.print();// 81test = in--;test.print();// 81in.print();// 80}void test88(){Integer x(10);Integer y(20);Integer z;z = x + y;z.print();z = x % y;z.print();z = x << y;z.print();x += y;x.print();int result;result = (x == y);cout << result << endl << endl;result = (x < y);cout << result << endl << endl;Byte m(11);Byte n(10);Byte k;k = m + n;k.print();m += n;m.print();int cc;cc = (m == n);cout << cc << endl << endl;n = n;n.print();n = m;n.print();}int main(){//test66();//test88();int x, y;IntArray a;a[0] = 60;a[1] = 80;a[2] = 100;a[3] = 130;cout << a[0] << ", " << a[1] << ", " << a[2] << endl << endl;cout << a;/*cin >> a;cout << a;*/cin >> a >> x >> y; // 这个可以表示连续的输入,cout << a << x << ", " << y << endl;return 0;}

0 0
原创粉丝点击