C++(OOP)重载操作符

重载操作符的定义

#include <iostream>

using namespace std;

class Person
{
	// 重载操作符: 加法
public:	
	// 重载函数必须重载 类类型
	// 定义重载操作符
	void operator+(const Person& lhs)
	{
		cout << "执行了重载的加法操作" << endl;	
	}
	// 最好不要重载 && || & *++(OOP)
};

int main()
{
	Person p1, p2;
	p1 + p2;

	return 0;
}
  • 不能重载的操作符:
    • ::
    • .*
    • .
    • ?:

重载输入输出操作符

  • 输出操作符 << 重载
  • 输入操作符 >> 重载
    重载输入操作符时要考虑输入错误的情况
#include <iostream>
#include <string>

using namespace std;

class Sales_item
{
// 非成员函数使用友元函数
friend ostream& operator<<(ostream& out, const Sales_item& s);
friend istream& operator>>(istream& in, Sales_item& s);
public:
	Sales_item(string &book, unsigned units, double price):
	isbn(book),units_sold(units),revenue(price * units){}
	Sales_item():units_sold(0), revenue(0.0){}
private:
	string isbn;
	unsigned units_sold;
	double revenue;
};

ostream& operator<<(ostream& out, const Sales_item& s)
{
	out << s.isbn << "\t" << s.units_sold << "\t" << s.revenue;	
	return out;
}

istream& operator >>(istream& in, Sales_item& s)
{
	// 输入操作符要考虑 输入错误的情况
	double price;
	in >> s.isbn >> s.units_sold >> price;
	if(in)
		s.revenue = s.units_sold * price;
	else
		s = Sales_item();
	
	return in;
}

int main()
{
	Dog a;
	int b;
	string isbn1 = "0-201-78345-X";

	Sales_item item(isbn1 , 2, 25.00);
	cout << "hello" << endl;
	cout << item << endl;

	cin >> item;
	cout << item << endl;

	return 0;
}

算数操作符重载

#include <iostream>

using namespace std;

class Sales_item
{
public:
	Sales_item(const std::string book,const unsigned units, const double amount):
		isbn(book),
		units_sold(units),
		revenue(amount){};
	Sales_item& operator+=(const Sales_item&);
	Sales_item& operator-=(const Sales_item&);
	friend std::ostream& operator<<(std::ostream&, const Sales_item&);
private:
	std::string isbn;
	unsigned units_sold;
	double revenue;
};

Sales_item operator+(const Sales_item&, const Sales_item&);
Sales_item operator-(const Sales_item&, const Sales_item&);

Sales_item& Sales_item::operator+=(const Sales_item& rhs)
{
	units_sold += rhs.units_sold;
	revenue += rhs.revenue;
	return *this;
}

Sales_item operator+(const Sales_item& lhs, const Sales_item& rhs)
{
	Sales_item ret(lhs);
	ret += rhs;
	return ret;
}

std::ostream& operator<<(std::ostream& out, const Sales_item& s){
	out << s.isbn << "\t" << s.units_sold << "\t" << s.revenue;
}

Sales_item& Sales_item::operator-=(const Sales_item& rhs)
{
	this->units_sold -= rhs.units_sold;
	this->revenue -= rhs.revenue;
	return *this;
}

Sales_item operator-(const Sales_item& lhs, const Sales_item& rhs)
{
	Sales_item ret(lhs);
	ret -= rhs;
	return ret;
}

int main()
{
	Sales_item item1(string("0-201-12345-X"), 10, 120.0);
	Sales_item item2(string("0-201-12345-X"), 20, 200.0);
	Sales_item result = item1 + item2;

	cout << result << endl;

	Sales_item item3(string("0-201-12345-X"), 5, 70.0);

	result += item3;
	cout << result << endl;

	result -= item2;
	cout << result << endl;

	result = item2 - item1;
	cout << result << endl;

	cout << "test" << endl;		
	return 0;
}

关系操作符重载

#include <iostream>
#include <stdlib.h>

using namespace std;

class Date
{
private:
	int month, day, year;
public:
	Date(int m=0, int d=0, int y=0):month(m),day(d),year(y)
	{};
	int operator==(Date & dt) const;
	int operator!=(Date & dt) const;
	int operator<=(Date & dt) const;
	int operator>(Date & dt) const;
};

int Date::operator==(Date& dt) const
{
	return (this->month == dt.month)
		&& (this->day == dt.day)
		&& (this->year == dt.year);
}

int Date::operator!=(Date& dt) const
{
	return !(*this == dt);
}

int Date::operator<(Date& dt) const
{
	if (this->year == dt.year)
	{
		if (this->month == dt.month)
			return this->day < dt.day;
		return this->month < dt.month;
	}
	return this->year < dt.year;
}

int main()
{
	Date d1(2, 14, 2005);
	Date d2(6, 19, 2005);
	Date d3(2, 14, 2005);
	if (d1 < d2)
		cout << "d1 < d2" << endl;
	
	if (d1 == d3)
		cout << "d1 = d3" << endl;
	cout << "test" << endl;
	return 0;
}

自增自减重载

#include <iostream>
#include <cstring>

using namespace std;

class String
{
public:
	String(char const *chars = "");
	String(String const &str);
	~String();

	void display() const;
	
	String &operator++(); // 前加加 ++i
	String const &operator++(int); // 后加加 i++
	String &operator--();
	String const &operator--(int);

private:	
	char *ptrChars;
};

String &String::operator++()
{
	for(std::size_t i=0; i<std::strlen(ptrChars); ++i)	
	{
		++ptrChars[i];
	}
	return *this;
}

String const &String::operator++(int)
{
	String &copy(*this);
	++(*this);
	return copy;
}

String::String(char const *chars)
{
	chars = chars ? chars: "";
	ptrChars = new char[std::strlen(chars) + 1];
	std::strcpy(ptrChars, chars);
}

String::String(String const &str)
{
	ptrChars = new char[std::strlen(str.ptrChars)+1];
	std::strcpy(ptrChars, str.ptrChars);
}

String::~String()
{
	delete[] ptrChars;
}

void String::display() const
{
	cout << ptrChars << endl;
}

int main()
{
	String str1("ABC");
	str1.display();
	String str2(++str1);
	str2.display();
	str1.display();
	String str3(str1++);
	str3.display();

	str1.display();

	cout << "test" << endl;	
		
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值