13. 运算符重载(一)

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

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

  • 可以通过自己写成员函数,实现两个对象相加属性后返回信的对象
Person Personaddperson(Person &p)
{
      Person temp;
      temp m_A = this->m_A + p.m_A;
      temp m_B = this->m_B + p.m_B;
      return temp;
}
  • 编译器这时想:你有 + 号 我也有,还不如我自己起一个通用名称 ————> 通过函数函数重载 + 号
Person operator+(Person &p)
{
      Person temp;
      temp m_A = this->m_A + p.m_A;
      temp m_B = this->m_B + p.m_B;
      return temp;
}
  • 调用时
    Person p3 = p1.operator +(p2) 简化为 Person p3 = p1 + p2
  • 当然也可以通过全局函数来重载

1. 加号运算符重载

#include <iostream>
using namespace std;
class Person 
{
public:
      //1. 成员函数重载 + 号
      Person operator+(Person &p)
      {
            Person temp;
            temp m_A = this->m_A + p.m_A;
            temp m_B = this->m_B + p.m_B;
            return temp;
      }

      int m_A;
      int m_B;
};

//2. 全局函数重载 + 号
Person operator+(Person &p1,Person &p2)
{
      Person temp;
      temp.m_A = p1.m_A + p2.m_A;
      temp.m_B = p1.m_B + p2.m_B;
      return temp;
}

//3. 函数重载版本
Person operator+(Person &p1,int num)
{
      Person temp;
      temp.m_A = p1.m_A + num;
      temp.m_B = p1.m_B + num;
      return temp;
}

void test01() //通过成员函数重载+号
{
      Person p1;
      p1.m_A = 10;
      p1.m_B =10;
      Person p2;
      p2.m_A = 10;
      p2.m_B = 10;

      // 成员函数的本质调用 Person p3 = p1.operator+(p2);
      // 全局函数重载本质调用 Person p3 = operator+(p1,p2);
      Person p3=p1+p2;  
      
      //运算符重载也可以发生函数重载:例如 Person + int
      Person p4 = p1 + 100;
      cout << "p3.m_A" << p3.m_A <<endl;
      cout << "p3.m_B" << p3.m_B <<endl;
}
int main()
{
      test01();
      system("pause");
      return 0;
}

2. 左移运算符

作用:可以输出自定义数据类型
目的:知道怎么通过输出对象,打印出对象所有属性的值
提问:

  • 当类中的成员变量为私有属性怎么能让全局函数访问该变量 ?
  • 为什么最好不要用成员函数来重载左移运算符 ?
#include <iostream>
using namespace std;
class Person 
{
public:
      //利用成员函数重载 左移运算符
      //通常不会利用成员函数重载 << 运算符,因为无法实现 cout 在左侧 ——> p.operator(cout) = p << cout
      
      int m_A;
      int m_B;
};

// 只能利用全局函数重载左移运算符
// 如果当类中成员变量为私有属性时可以利用友元来访问
//cout 为标准输出流对象,这里为什么用引用呢?cout 该对象全局只能有一个;当然不要忘记引用的本质就是“起别名”,这里的cout 可以替换成其他的。
ostream & operator<<( ostream &cout,Person &p) 
{
      cout <<"m_A = " << p.m_A << "m_B ="<< p.m_B;
      return cout;
}
void test02()
{
      Person p;
      p.m_A = 10;   //当类成员变量为私有属性时,可以通过构造函数来进行赋值操作
      p.m_B = 10;
      cout << p << endl;  // 注意这里如果全局函数返回值为 void 由于链式调用的思想会报错,
                          // 当然了你也可以把左移运算符当作前面的加号重载,该运算符左右两边一定要有变量。
}
int main()
{
      test02();
      system("pause");
      return 0;
}

猜你喜欢

转载自www.cnblogs.com/BY1314/p/12873984.html