运算符重载

    科技2022-07-10  138

    operatorop() op必须为有效的C++运算符 1.成员函数重载运算符 2.全局函数重载运算符 3.运算符重载也可实现函数重载 一、加号运算符重载

    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 fun() { Person p1; p1.m_A = 3; p1.m_B = 5; Person p2; p2.m_A = 9; p2.m_B = 33; //成员函数重载本质调用 //Person p3 = p1.operator+(p2);//可简化为Person p3 = p1 + p2; //全局函数重载本质调用 //Person p3 = operator+(p1, p2);//可简化为Person p3 = p1 + p2; Person p3 = p1 + p2; Person p4 = p1 + 32; }

    对于内置的数据类型的表达式的运算符是不可能改变的 如:+号不能实现相减运算

    二、递增运算符重载 前置递增

    //前置++ //返回引用是为了对同一个数据进行递增操作 Number& operator++() { m_A++;//先++ return *this;//然后返回自身,this指针指向对象本身的地址 //*this是指向对象本身的值,也就是+1后的值 }

    使用引用能实现二次重载递增,也就是cout<<++(++num)<<endl;,若不返回引用,则无法实现连续递增的功能 后置递增

    //后置++ //使用占位函数int让编译器知道这是函数重载,区分前置后置 Number operator++(int) { //创建临时对象temp来保存当前值 Number temp = *this; m_A++; return temp;//返回的temp是局部对象,当前函数执行完就被释放,如果返回的是引用会出错,所以返回值 }

    临时对象temp属于局部对象,在函数实现完成后,系统会自动清空数据,若返回引用就属于非法操作

    三、函数调用运算符重载

    class Print { public: void operator()(string text)//重载函数调用运算符 { cout << text << endl; } }; void myPrint2(string text) { cout << text << endl; } void fun() { Print myPrint; myPrint("abcd");//类似于函数调用,称为仿函数 myPrint2("abc"); }

    仿函数(functor),是通过重载()运算符模拟函数形为的类

    class Add { public: int operator()(int a, int b) { return a + b; } }; void fun2() { Add myadd; int result = myadd(23, 34); cout << "result = " << result << endl; //匿名对象调用:Add()创建匿名对象 cout << "myadd()(34, 23) = " << Add()(34, 23) << endl; }

    匿名对象只存在于构造该对象的那行代码,离开构造匿名对象的那行代码后立即调用析构函数

    Processed: 0.014, SQL: 8