运算符重载

运算符重载本质:函数调用

实现方法:将基本类型进行封装,提供一个接口。

complex C4 = C1 + C2;
重写 operator+这个函数即可。(返回值是complex)

实现函数重载步骤:
1、承认操作符重载是一个函数,写出函数名称
2、根据操作数,写出函数参数
3、确定返回值(引用,指针,元素)及实现函数业务

二元运算符重载:
以复数相加为例:
全局函数法:
complex operator+(complex &C1, complex &C2) {}
当成员a和b为私有成员数据时,应该把这个函数声明为complex类是友元函数;
成员函数法:(成员函数隐含this指针)
由调用方法C1.operator+(C2)倒推:成员函数隐含this指针,指向C1对象的地址,所以参数只传入一个C2的引用即可。
complex operator+(&C2)
{
  complex tem(this->a + C2.a, this->b + C2.b);
  return tem;
}

一元运算符重载:
++a --a (前置)
成员函数:
complex& operator--()
{
  this->a--;
  this->b--;
  return *this;
}
complex& operator--(complex& _c)
{
  _c.a--;
  _c.b--;
  return -c;
}
a++ a--(后置)
运算符重载:参数个数,参数类型,不同类型参数顺序
前置已经写了这种方法,后置由C++提供的占位符(哑元)来实现参数个数的不同
全局函数:
complex operator++(complex& C1, int) //声明为类的友元函数
{
  complex tem = C1;
  C1.a++;
  C2.b++;
  return tem;
}
成员函数:
complex operator--(int)
{
  complex tem(this->a,this->b);
  this->a--;
  this->b--;
  return tem;
}

以上主要使用成员函数的方法实现,以下看一下需要友元函数的情景。
重载 << >> 左右移 输入输出
友元函数法:
void operator<<(ostream& out, complex& c1) //在类中声明为友元
{
  out<<c1.a << "+" << c1.b << "i" << endl;
}
而使用成员函数法,需要在cout的类ostream中声明成员函数,而ostream的源码未知。。。
cout << C1;可用
但cout << C1 << "afs";不可用,提示operator<<,左操作数包含“void类型
输出流<<左结合,cout << C1 << "afs"转换为void << "afs";
所以函数返回不能为空,返回一个引用,才可以当左值,支持链式编程。
ostream& operator<<(ostream& out, complex& c1) //在类中声明为友元
{
  out<<c1.a << "+" << c1.b << "i" << endl;
}

成员函数一般用于左右操作数类型不一样的情景;
对于+,需要使用友元函数方法才能保证34+C1和C1+34都可用。
34不是对象,没法通过调用成员函数。

C++规定不能用友元函数重载 = () [] ->

类中有指针时,避免浅拷贝,重载 =
步骤:
1、先释放内存
2、申请内存
3、返回引用(支持链式编程)
Name& operator=(Name &obj1) //= 是右结合性
{
     if(this->m_p != NULL) //待赋值对象的指针成员先释放掉,避免内存泄漏
{
      delete [] m_p;
      m_len = 0;
}
  this->m_len = obj1.m_len;
  this->m_p = new char [m_len+1];
  strcpy(m_p, obj1.m_p); //数组名是字符串首地址。strcpy(this->m_p, obj1.m_p)也可以
  return *this;
}

&& || 函数重载无法实现短路规则,一般不重载
t1 && (t1+t2)
t1.operator&&(t1.operator+(t2))

posted @ 2016-07-16 14:13  Lunais  阅读(219)  评论(0编辑  收藏  举报