4.运算符重载

什么是运算符重载

所谓重载,就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义,使之实现新功能,因此,一个函数名就可以用来代表不同功能的函数,也就是”一名多用”,运算符也可以重载。

1为什么会用运算符重载机制
      用复数类举例
      Complex c3 = c1 + c2;
     原因 Complex是用户自定义类型,编译器根本不知道如何进行加减
      编译器给提供了一种机制,让用户自己去完成,自定义类型的加减操作。。。。。
      这个机制就是运算符重载机制
2 运算符重载的本质是一个函数

运算符重载的限制

以下运算符不能重载

.    ::    .*    ? :    sizeof

除以上运算符不能重载外大部分运算符可以重载。重载运算符函数可以对运算符作出新的解释,但原有基本语义不变:

  • 不改变运算符的优先级
  • 不改变运算符的结合性
  • 不改变运算符所需的操作数
  • 不能创建新的运算符

运算符重载基础

 例如:
  //全局函数 完成 +操作符 重载
Complex operator+(Complex &c1, Complex &c2)
//类成员函数 完成 -操作符 重载
Complex operator-(Complex &c2)

二元运算符

重载为成员函数时,解释为由左操作数调用,左操作数通过 this 指针传递,右操作数通过参数传递。

重载为友元函数时,左右操作数都由参数传递。

一元运算符

重载为成员函数时,操作数通过 this 指针传递。

重载为友元函数时,操作数由参数传递。

前置和后置运算符总结

C++中通过一个占位参数来区分前置运算和后置运算,有占位参数的为后置运算符。

友元函数和成员函数的选择方法

当无法修改左操作数的类时,使用全局函数进行重载
=,  [ ] , ( ) 和 -> 操作符只能通过成员函数进行重载

用友元函数重载 << >> 实例

class MyString
{
	
private:
	char *m_data;
	int m_len;
public:
	MyString();
	MyString(char *str);
	//重载 << >>
	friend ostream &operator <<(ostream &out, const MyString &s);
	friend istream &operator >>(istream &in, MyString &s);
};
ostream &operator <<(ostream &out, const MyString &s)
{
	out << s.m_data;
	return out;
}

istream &operator >>(istream &in, MyString &s)
{
	char str[1024] = {0};
	in >> str;
	if (s.m_data != NULL)
	{
		delete s.m_data;
	}
	s.m_len = strlen(str);
	s.m_data = new char[s.m_len + 1];
	strcpy(s.m_data, str);
	
	return in;
}

为什么不要重载 && 和 | | 运算符

1)&&和||是C++中非常特殊的操作符 
2)&&和||内置实现了短路规则 
3)操作符重载是靠函数重载来完成的 
4)操作数作为函数参数传递 
5)C++的函数参数都会被求值,无法实现短路规则 

总结

  • 操作符重载是C++的强大特性之一
  • 操作符重载的本质是通过函数扩展操作符的语义
  • operator关键字是操作符重载的关键
  • friend关键字可以对函数或类开发访问权限
  • 操作符重载遵循函数重载的规则
  • 操作符重载可以直接使用类的成员函数实现
  • =, [], ()和->操作符只能通过成员函数进行重载
  • ++操作符通过一个int参数进行前置与后置的重载
  • C++中不要重载&&和||操作符

猜你喜欢

转载自blog.csdn.net/qq_42717879/article/details/81231395