运算符重载2

#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(); // 81

	test = in++;
	test.print(); // 81
	in.print();  // 82

	--in;
	in.print();// 81

	test = in--;
	test.print();// 81
	in.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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值