栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++运算符重载

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++运算符重载

运算符重载(操作符重载):可以为运算符增加一些新的功能。

全局函数、成员函数都支持运算符重载。

#include 
using namespace std;

class Point {
	friend Point operator+(const Point &, const Point &);
	int m_x;
	int m_y;
public:
	Point(int x, int y) : m_x(x), m_y(y) {}
	void display() {
		cout << "(" << m_x << ", " << m_y << ")" << endl;
	}
};

Point operator+(const Point &p1, const Point &p2) {
	return Point(p1.m_x + p2.m_x, p1.m_y + p2.m_y);
}

int main() {
	Point p1(10, 20);
	Point p2(20, 30);

	Point p3 = p1 + p2;
	p3.display();
	
	Point p4 = p1 + p2 + p3;
	p4.display();

	getchar();
	return 0;
}
#include 
using namespace std;

class Point {
	friend ostream &operator<<(ostream &, const Point &);
	friend istream &operator>>(istream &, Point &);
	int m_x;
	int m_y;
public:
	Point(int x, int y) : m_x(x), m_y(y) {}

	Point(const Point& point) {
		m_x = point.m_x;
		m_y = point.m_y;
	}

	void display() {
		cout << "(" << m_x << ", " << m_y << ")" << endl;
	}
	
	const Point operator+(const Point &point) const {
		return Point(m_x + point.m_x, m_y + point.m_y);
	}

	const Point operator-(const Point &point) const {
		return Point(m_x - point.m_x, m_y - point.m_y);
	}

	Point &operator+=(const Point &point) {
		m_x += point.m_x;
		m_y += point.m_y;
		return *this;
	}

	bool operator==(const Point &point) const {
		return (m_x == point.m_x) && (m_y == point.m_y);
	}

	bool operator!=(const Point &point) const {
		return (m_x != point.m_x) || (m_y != point.m_y);
	}

	const Point operator-() const {
		return Point(-m_x, -m_y);
	}

	// 前置++
	Point &operator++() {
		m_x++;
		m_y++;
		return *this;
	}

	// 后置++
	const Point operator++(int) {
		Point old(m_x, m_y);
		m_x++;
		m_y++;
		return old;
	}
};


ostream &operator<<(ostream &cout, const Point &point) {
	cout << "(" << point.m_x << ", " << point.m_y << ")";
	return cout;
}

istream &operator>>(istream &cin, Point &point) {
	cin >> point.m_x;
	cin >> point.m_y;
	return cin;
}


//class Person {
//private:
//	int m_age;
//	int m_height;
//	void operator=(const Person &person) {}
//public:
//	Person(int age = 0, int height = 0) :m_age(age), m_height(height) {}
//	
//	void display() {
//		cout << m_age << ", " << m_height << endl;
//	}
//};

int main() {
	Point p1(10, 20);
	Point p2(20, 30);

	Point p3 = p1 + p2;
	cout << p3 << endl;

	cin >> p1;
	cout << p1 << endl;
	
	p3 += p1;
	cout << p3 << endl;

	getchar();
	getchar();
	return 0;
}
#include 
using namespace std;

class Person {
private:
	int m_age;
	int m_height;
	void operator=(const Person &person) {}
public:
	Person(int age = 0, int height = 0) : m_age(age), m_height(height) {}
	void display() {
		cout << m_age << ", " << m_height << endl;
	}
};

int main() {

	Person p1(10, 180);
	Person p2(11, 175);
	p1 = p2; // 报错:=重载函数私有化

	getchar();
	return 0;
}
调用父类的运算符重载函数
#include 
using namespace std;

class Person {
	int m_age;
public:
	Person(int age) : m_age(age) {}

	Person &operator=(const Person &person) {
		m_age = person.m_age;
		return *this;
	}

	int getAge() {
		return m_age;
	}
};

class Student : public Person {
	int m_score;
public:
	Student(int age, int score) : m_score(score), Person(age) {}
	
	Student &operator=(const Student &student) {
		Person::operator=(student);
		m_score = student.m_score;
		return *this;
	}
	
	int getScore() {
		return m_score;
	}
};

int main() {
	Student stu1(18, 90);
	Student stu2(20, 100);
	cout << stu2.getAge() << " " << stu2.getScore() << endl;

	stu2 = stu1;
	cout << stu2.getAge() << " " << stu2.getScore() << endl;

	getchar();
	return 0;
}
仿函数

仿函数:将一个对象当作一个函数一样来使用。

对比普通函数,它作为对象可以保存状态。

#include 
using namespace std;

class Sum {
	int m_age;
public:
	int operator()(int a, int b) {
		return a + b;
	}
};

int main() {

	Sum sum;
	cout << sum(10, 20) << endl; // 等价于sum.operator()(10, 20)

	getchar();
	return 0;
}
注意

有些运算符不可以被重载,比如
 对象成员访问运算符:.
 域运算符:::
 三目运算符:?:
 sizeof

有些运算符只能重载为成员函数,比如:
赋值运算符 =
下标运算符 []
函数运算符 ()
指针访问成员 ->

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/737676.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号