C初阶长期更新第4讲类和对象中跟着潼心走轻松拿捏C困惑通通走一去不回头~欢迎开始今天的学习内容你的支持就是博主最大的动力。博主主页潼心1412o-CSDN博客前言今天继续学习的类和对象gogogo出发喽~4.1 运算符重载1.当运算符被⽤于类类型的对象时C语⾔允许我们通过运算符重载的形式指定新的含义2.是具有特殊名字的函数他的名字是由operator和后⾯要定义的运算符共同构成3.重载运算符函数的参数个数和该运算符作⽤的运算对象数量⼀样多。⼀元运算符有⼀个参数⼆元运算符有两个参数⼆元运算符的左侧运算对象传给第⼀个参数右侧运算对象传给第⼆个参数。4.如果⼀个重载运算符函数是成员函数则它的第⼀个运算对象默认传给隐式的this指针因此运算 符重载作为成员函数时参数⽐运算对象少⼀个。#includeiostream using namespace std; class Date { public: Date(int year 1, int month 1, int day 1) { _year year; _month month; _day day; } //private: int _year; int _month; int _day; }; bool operator(const Date x1, const Date x2) { return x1._year x2._year x1._month x2._month x1._day x2._day; } int main() { Date d1; Date d2(d1); operator(d1, d2); d1 d2; return 0; }我们发现想使用类中的private成员有点麻烦解决方法为将operator函数放为类的成员函数但是这就涉及到参数个数的问题了因为有默认的this指针作为成员函数的第一个参数所以可以支配的参数数量就减少了一个// 重载为全局的⾯临对象访问私有成员变量的问题// 有⼏种⽅法可以解决// 1、成员放公有// 2、Date提供getxxx函数// 3、友元函数// 4、重载为成员函数#includeiostream using namespace std; class Date { public: Date(int year 1, int month 1, int day 1) { _year year; _month month; _day day; } bool operator(const Date d) { return _year d._year _month d._month _day d._day; } private: int _year; int _month; int _day; }; int main() { Date d1; Date d2(d1); d1.operator(d2); d1 d2; return 0; }5.不能通过连接语法中没有的符号来创建新的操作符⽐如operator。6. .* :: sizeof ?: .注意以上5个运算符不能重载。//.*是何物 class A { public: void func() { cout func() endl; } }; void f() { cout f() endl; } int main() { //函数指针 void (*func1)() f; (*func1)(); //成员函数指针 void (A:: * func2)() A::func; A aa; (aa.*func2)(); //注意这里定义时需要指定类域且地址需要取地址符 //调用时需要指定对象 return 0; }7.操作符⾄少有⼀个类类型参数不能通过运算符重载改变内置类型对象的含义如 intoperator(int x, int y)8.类需要重载哪些运算符是看哪些运算符重载后有意义4.2 日期类opertor的实现//Date.h class Date { public: Date(int year 1, int month 1, int day 1); Date operator(int day); int GetMonthDays(); void Print(); private: int _year; int _month; int _day; };//Date.cpp #includeiostream #includeDate.h using namespace std; Date::Date(int year, int month, int day) { _year year; _month month; _day day; } int Date::GetMonthDays() { static int a[13] { -1,31,28,31,30,31,30,31,31,30,31,30,31 }; if (_month 2 (_year % 4 0 _year % 100 ! 0) || (_year % 400 0)) { return 29; } else return a[_month]; } Date Date::operator(int day) { _day day; while (_day GetMonthDays()) { _day - GetMonthDays(); _month; if (_month 13) { _month 1; _year; } } return *this; } void Date::Print() { cout _year / _month / _day endl; } int main() { Date d1(2026, 9, 30); Date d2 d1 100; d1.Print(); d2.Print(); return 0; }好了今天的学习内容就到这里啦谢谢你的陪伴我是潼心下次再见~如果这篇文章对你有帮助的话。请务必给主播一个一键三连球球了这对主播很重要~博主主页潼心1412o-CSDN博客
阅读完成 · 觉得有帮助?