类和对象(中)——运算符重载
引入语言在语法上可以直接用指令实现运算符对 内置类型 的操作C中加入了类类型那如何使用以前的运算符如 - * / 等对类类型进行操作呢由此引入运算符重载C为了增强代码的可读性引入了运算符重载运算符重载是具有特殊函数名的函数本质也具有其返回值类型函数名字以及参数列表其返回值类型与参数列表与普通的函数类似。函数名为关键字operator后面接需要重载的运算符符号。函数原型返回值类型 operator操作符(参数列表)全局函数形式class Date{public:Date(int year 1, int month 1,int day 1){_year year;_month month;_day day;}//暂时注释private//private:int _year;int _month;int _day;};booloperator(Date d1, Date d2) //作为全局函数参数要保证完整{if (d1._year d2._year)return true;else if (d1._year d2._year){if (d1._month d2._month)return true;else if (d1._month d2._month)return d1._day d2._day;}elsereturn false;}int main(){Date d1(2024,4,1);Date d2(2024,4,2);//两种调用方法本质相同一般采用转换调用可读性更强//调用时会检查 是否已经重载函数名operator 和 参数列表若未匹配到相应的重载函数则报错coutoperator(d1, d2)endl;//显式调用cout (d1 d2) endl;//转换调用编译器会转换成operator(d1, d2)return 0;}注意事项1.不能通过连接其他符号来创建新的操作符比如operator不是C内置操作符2. 重载操作符至少有一个类类型参数3. 重载运算符时其含义在实践应用上一般不改变例如内置整型不改变其相加含义4.以类成员函数形式实现重载时其形参看起来比操作数数目少1因为成员函数的第一个参数为隐藏的this5..* :: sizeof ?: .注意以上5个运算符不能重载。补充.*操作符class OB { public: void func() {} }; typedef void(OB::* PtrFunc)(); // 成员函数指针类型 //OB::* PtrFunc表示这是一个指向 OB 类成员函数的指针类型 //void()表示该成员函数无参数、返回值为 void int main() { // 成员函数必须加才能取到函数指针 PtrFunc fp OB::func; OB temp; // 通过对象调用成员函数指针 (temp.*fp)(); //temp.func(); return 0; }类成员函数形式上述运算符重载成全局函数所以不得不解除类成员私有。为了类的安全性一般可以将运算符重载为类成员函数注意类成员函数第一个参数为隐藏的this指针实际传参不能传递第一个参数以保持参数个数与操作数个数一致。还有两种方法C不常使用1. 创建类函数getsetget返回类成员变量的引用(推荐加const)/值set传值修改类成员变量的值 2. 友元class Date{public:Date(int year 1, int month 1,int day 1){_year year;_month month;_day day;}bool operator(Date d){return this-_year d._year this-_month d._month this-_day d._day;}private:int _year;int _month;int _day;};int main(){Date d1(2024, 4, 1);Date d2(2024, 4, 2);//显示调用coutd1.operator(d2)endl;//直接去类中调用重载//转换调用编译器转换cout (d1 d2) endl;//先检查类中是否重载再检查全局是否重载都有则优先使用类中函数return 0;}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2453474.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!