C++的运算符重载

运算符重载

运算符重载顾名思义,就是对已知的运算符进行重新定义,除了相同名称的声明,它们的参数列表和定义(实现)不相同。
与其他函数一样,重载运算符有一个返回类型和一个参数列表。
运算符重载有两种方式:一种是类内重载(运算符重载函数作为类的成员函数),另一种是类外重载(运算符重载函数作为类的友元函数)

函数调用运算符重载(仿函数)

使用场景:函数调用运算符 () 可以被重载用于类的对象
作用:创建一个可以传递任意数目参数的运算符函数

class Student {
public:
	Student(string m, int n): m_Name(m), m_Age(n) {}
	~Student() {}
	// 重载构造函数,直接对类成员进行操作
	Student operator()(int a, int b, int c) {
		Student S;
		S.m_Name = a + c + 10;
		S.m_Age = b + c + 100;
		return S;
	}
	void Show() {
		cout << m_Name;
		cout << m_Age;
		cout << endl;
	}
private:
	string m_Name;
	int m_Age;
}
int main() {
	Student S1(10, 10, 10), S2;
	S2 = S1;
	cout << S2.Show() << endl;
	return 0;
} 

当有调用相同数量参数的时候是调用构造函数还是仿函数?
调用仿函数!
使用场景:

Student s1(10, 10, 10), s2;
s2 = s1;
/*
/*此处要注意Student s2; Student s2 = s1;和Student s2 = s1;的区别
/*第一个是先用无参构造函数(浅拷贝),第二个是拷贝构造函数(深拷贝)
*/

继承是否:不能被继承,因为每个重载运算符函数只能是用来处理自己的数据成员,不能处理其他类的数据成员。

左移(右移)运算符重载

有些难理解,我多写一点蛤
首先要知道cout是输出流,是ostream类中定义的一个对象
可以这么看

#include <ostream>
ostream cout;

而且<<也可以看做是ostream里面的一个已经是运算符重载的函数,单纯的进行输出,所以cout这个对象可以调用<<这个函数

cout << ""

为什么要类外重载呢?
因为如果在类内重载,对类进行输出的时候就变成了p << cout,这看起来很别扭啊!
所以在类内重载并且使用友元函数

#include <ostream>

ostream& operator()(ostream& cout, Student& s) {
	// 此处使用的还是ostream类内的运算符重载
	cout << s.m_Name << s.m_Age << endl;
	return cout;
}

为什么在在最后返回cout呢?可能大家有这个疑问。
因为假设已经实例化了一个对象s

Student s;
cout << s

请读者一定要记住,在运算符重载里面的cout绝对不是外面进行输出的cout!
全过程是这样的(我尽量写的清楚些):
首先这个<<是运算符重载自不必说,两个参数,一个是ostream& cout,Student& s,其中cout这个对象是从ostream中实例化的对象,从头文件来的,并不是下面的cout <<中的cout,用这个对象进行初始化的<<操作,即函数内的cout << s.m_Name << s.m_Age << endl;,则在外界,一个<<p即是ostream& operator()(ostream& cout, Student& s),但是要通过ostream里面再实例化一个对象cout来调用<<这个已经被双重重载的运算符,即cout << p,cout调用了这个函数,返回值就为cout,即还是ostream类的一个对象,可以看做一个递归效果!cout << p又返回cout ,又接着后面的 << ,再次组合成cout << ,直到到行末变成cout << endl;结束!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妖怪喜欢风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值