1001运算符重载基础

94 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第23天,点击查看活动详情

  • 运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型

1.1加号运算符重载

  • 运算加号运算符重载的作用:实现两个自定义数据类型相加的

1. 成员函数实现 + 号运算符重载

class books{
	public: 
	string book01;
	string book02;
	books operator+(books &h)	{
		books H ;
		H.book01 = this->book01 + h.book01;
		H.book02 = this->book02 + h.book02;
	    return H;	
	}
 }; 
 int main() {
     books h01;
     books h02;
     books h03;
     h01.book01 = "有顶天";
	 h02.book01 = "家族";
	 h01.book02 = "黑魔法";
	 h02.book02 = "手贴";
	h03 = h01 + h02;//相当于h03 = h01.operator+(h02) 
	cout << h03.book01 << endl;
	cout << h03.book02 << endl;
	system("pause");
	return 0;
}

输出:

有顶天家族
黑魔法手贴
请按任意键继续. . .

2.全局函数实现 + 号运算符重载

books operator+(books &h_00,books &h_01)	{
		books H ;
		H.book01 = h_00.book01 + h_01.book01;
		H.book02 = h_00.book02 + h_01.book02;
	    return H;
	}
	int main() {
     books h01;
     books h02;
     books h03;
     h01.book01 = "有顶天";
	 h02.book01 = "家族";
	 h01.book02 = "黑魔法";
	 h02.book02 = "手贴";
	h03 = h01 + h02;//相当于h03 = operator+(h01,h02) 
	cout << h03.book01 << endl;
	cout << h03.book02 << endl;
	system("pause");
	return 0;
}

输出:

有顶天家族
黑魔法手贴
请按任意键继续. . .

3. 运算符重载 可以发生函数重载

books operator+(books &h_00,books &h_01)	{
		books H ;
		H.book01 = h_00.book01 + h_01.book01;
		H.book02 = h_00.book02 + h_01.book02;
	    return H;
	}
books operator+(books &h_00,string a)	{
		books H ;
		H.book01 = h_00.book01 + a;
//		H.book02 = h_00.book02 + b;
	    return H;
	}	
h04 = h01 + string("家族") ; 
cout << h04.book01 << endl;

注意: 重载的参数不能超过两个

books operator+(books &h_00,string a,string b)	{
		books H ;
		H.book01 = h_00.book01 + a;
		H.book02 = h_00.book02 + b;
	    return H;
	}	
	//错误提示:[Error] 'books operator+(books&, std::string, std::string)' must take either one or two arguments

1.2 左移运算符重载

作用: 可以输出自定义数据类型

class books{
	friend ostream& operator<<(ostream& cout,books &h01); 
	public:
	books()
	{
	    book01 = "有顶天家族";
		book02 = "黑魔法手贴";	
	}
	//成员函数 实现不了  h00 << cout 不是我们想要的效果
	//void operator<<(books& h00){
	//}

	private: 
	string book01;
	string book02;	
 }; 
 //全局函数实现左移重载
//ostream对象只能有一个
 ostream& operator<<(ostream& cout,books &h01)	{
		cout << h01.book01 << endl;
		cout << h01.book02<<endl; 
	    return cout;
	}
//相当于下面的语句
//ostream& operator<<(ostream& out,books &h01)	{
//		cout << h01.book01 << endl;
//		cout << h01.book02<<endl; 
//	    return out;
//	}	
//cout << h01 << endl;

输出:

有顶天家族
黑魔法手贴

请按任意键继续. . .

1.3 递增运算符重载

作用: 通过重载递增运算符,实现自己的整型数据

class books{
	//<< 接的后++返回值是books型,所以<<传入参数用books才不会错 
	friend ostream& operator<<(ostream& cout,books h01); 
	public:
	//记录当前本身的值,然后让本身的值加1,但是返回的是以前的值,达到先返回后++;
	//后置++ 先返回 再++
	books operator++(int){
	books h00 = *this;
	a++;
	return h00;
}
//前置++ 先++ 再返回
    books& operator++(){
	a++;
	return *this;
}
	private: 
	int a = 0;	
 }; 
 ostream& operator<<(ostream& cout,books h01)	{
		cout << h01.a << endl;
	    return cout;
	}
	books h01;
	cout << h01++ << endl;
	cout << h01 << endl;
	cout << ++h01 << endl;
	cout << h01 << endl;

输出:

0

1

2

2

请按任意键继续. . .

1.4 总结

1.对于内置的数据类型的表达式的的运算符是不可能改变的

2.不要滥用运算符重载

3.不用解引用返回的是一个新的值,而不是一直对原本的对象进行操作。重载左移运算符配合友元可以实现输出自定义数据类型

4. 前置递增返回引用,后置递增返回值