花都移动网站建设,专业的网上购物平台,货代怎么找客户,国外html5网站建设研究现状运算符重载
• 当运算符被⽤于类类型的对象时#xff0c;C语⾔允许我们通过运算符重载的形式指定新的含义。C规定类类型对象使⽤运算符时#xff0c;必须转换成调⽤对应运算符重载#xff0c;若没有对应的运算符重载#xff0c;则会编译报错。 • 运算符重载是具有特名字的…运算符重载
• 当运算符被⽤于类类型的对象时C语⾔允许我们通过运算符重载的形式指定新的含义。C规定类类型对象使⽤运算符时必须转换成调⽤对应运算符重载若没有对应的运算符重载则会编译报错。 • 运算符重载是具有特名字的函数他的名字是由operator和后⾯要定义的运算符共同构成。和其他函数⼀样它也具有其返回类型和参数列表以及函数体。 • 重载运算符函数的参数个数和该运算符作⽤的运算对象数量⼀样多。⼀元运算符有⼀个参数⼆元 运算符有两个参数⼆元运算符的左侧运算对象传给第⼀个参数右侧运算对象传给第⼆个参数。 • 如果⼀个重载运算符函数是成员函数则它的第⼀个运算对象默认传给隐式的this指针因此运算符重载作为成员函数时参数⽐运算对象少⼀个。 • 运算符重载以后其优先级和结合性与对应的内置类型运算符保持⼀致。 • 不能通过连接语法中没有的符号来创建新的操作符⽐如operator。 • .* :: sizeof ?: . 注意以上5个运算符不能重载。(选择题⾥⾯常考⼤家要记⼀下) • 重载操作符⾄少有⼀个类类型参数不能通过运算符重载改变内置类型对象的含义如 int operator(int x, int y) • ⼀个类需要重载哪些运算符是看哪些运算符重载后有意义⽐如Date类重载operator-就有意 义但是重载operator就没有意义。
• 重载运算符时有前置和后置运算符重载函数名都是operator⽆法很好的区分。 C规定后置重载时增加⼀个int形参跟前置构成函数重载⽅便区分。 • 重载和时需要重载为全局函数因为重载为成员函数this指针默认抢占了第⼀个形参位 置第⼀个形参位置是左侧运算对象调⽤时就变成了对象cout不符合使⽤习惯和可读性。 重载为全局函数把ostream/istream放到第⼀个形参位置就可以了第⼆个形参位置当类类型对 象。
取地址运算符重载
• 将const修饰的成员函数称之为const成员函数const修饰成员函数放到成员函数参数列表的后⾯。 • const实际修饰该成员函数隐含的this指针表明在该成员函数中不能对类的任何成员进⾏修改。 const修饰Date类的Print成员函数Print隐含的this指针由 Date* const this 变为 const Date* const this 取地址运算符重载分为普通取地址运算符重载和const取地址运算符重载⼀般这两个函数编译器⾃动⽣成的就可以够我们⽤了不需要去显⽰实现。除⾮⼀些很特殊的场景⽐如我们不想让别⼈取到当前类对象的地址就可以⾃⼰实现⼀份胡乱返回⼀个地址
日历代码
头文件
#pragma once
#includeassert.h
#includeiostream
using namespace std;
class Date
{friend ostream operator(ostream out, const Date p);friend istream operator(istream in,Date p);
public:Date(int year, int month, int day);void Print(void);bool CheckDate(){if (_month 1 || _month12 || _day1 || _day GetMonthDay(_year, _month)){return false;}else{return true;}}int GetMonthDay(int year, int month){assert(month 0 month 13);static int monthDayArray[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 monthDayArray[month];}}bool operator(const Date d);bool operator(const Date d);bool operator(const Date d);bool operator(const Date d);bool operator(const Date d);bool operator!(const Date d);Date operator(int day);Date operator(int day);Date operator-(int day);Date operator-(int day);Date operator();Date operator(int);Date operator--();Date operator--(int);//void operator(ostream out);int operator-(const Date d);private:int _year;int _month;int _day;
};ostream operator(ostream out,const Date p);
istream operator(istream in,Date p);功能代码
#define _CRT_SECURE_NO_WARNINGS
#include Date.hDate::Date(int year 2000, int month 1, int day 1)
{_year year;_month month;_day day;if (!CheckDate()){cout error endl;cout *this;}
}void Date::Print()
{cout _year - _month - _day endl;
}bool Date::operator(const Date d)
{if (_year d._year){return true;}else if (_year d._year _month d._month){return true;}else if (_year d._year _month d._month _day d._day){return true;}return false;
}bool Date::operator(const Date d)
{return !(*this d);
}bool Date::operator(const Date d)
{return !(*this d);
}bool Date::operator(const Date d)
{return *this d || *this d;
}bool Date::operator!(const Date d)
{return !(*this d);
}bool Date::operator(const Date d)
{return _year d._year _month d._month _day d._day;
}Date Date::operator(int day)
{Date tmp *this;tmp day;return tmp;
}
Date Date::operator(int day)
{_day day;while (_day GetMonthDay(_year, _month)){_day - GetMonthDay(_year, _month);_month;if (_month 13){_year;_month 1;}}return (*this);
}Date Date::operator-(int day)
{_day - day;while (_day 0){--_month;if (_month 0){_month 12;--_year;}_day GetMonthDay(_year, _month);}return *this;
}
Date Date::operator-(int day)
{Date tmp *this;tmp - day;return tmp;
}Date Date::operator()
{*this 1;return *this;
}
Date Date::operator(int)
{Date tmp *this;*this 1;return tmp;
}Date Date::operator--()
{*this - 1;return *this;
}
Date Date::operator--(int)
{Date tmp *this;*this - 1;return tmp;
}int Date::operator-(const Date d)
{Date max *this;Date min d;int flag 1;if (*this d){max d;min *this;flag -1;}int n 0;while (min ! max){min;n;}return n * flag;
}istream operator(istream in,Date p)
{while(1){cout year month day;in p._year p._month p._day;if (p.CheckDate()){break;}else{cout error endl;}}return in;
}
ostream operator(ostream out,const Date p)
{out p._year 年 p._month 月 p._day endl;return out;
}