当前位置: 首页 > news >正文

o2o手机网站建设难心理学网站开发

o2o手机网站建设难,心理学网站开发,微信小程序源代码,文本网站代码空两格怎么做目录 一、 日期类的实现 Date.h 1.1 GetMonthDay函数#xff08;获取某年某月的天数#xff09; 问#xff1a;这个函数为什么不和其他的函数一样放在Date.cpp文件中实现呢#xff1f; 1.2 CheckDate函数#xff08;检查日期有效性#xff09;、Print函数#xff08;…目录 一、 日期类的实现 Date.h 1.1 GetMonthDay函数获取某年某月的天数 问这个函数为什么不和其他的函数一样放在Date.cpp文件中实现呢 1.2 CheckDate函数检查日期有效性、Print函数打印日期 1.3 实现日期类的逻辑运算符重载 运算符的重载 运算符重载 其他运算符重载  1.4 日期与天数加减操作符重载 1.5 日期相减时的操作符重载 1.6 前置运算符和后置运算符实现的区别 前置运算符的语义是“先操作再返回”。 后置运算符的语义是“先返回再操作”。 1.7 输入输出流重载 为什么参数顺序为(ostream out, const Date d)? 二、const成员 请思考下面的几个问题 1. const对象可以调用非const成员函数吗  2. 非const对象可以调用const成员函数吗 3. const成员函数内可以调用其它的非const成员函数吗  4. 非const成员函数内可以调用其它的const成员函数吗 三、取地址及const取地址操作符重载  一、 日期类的实现 Date.h #define _CRT_SECURE_NO_WARNINGS 1 #pragma once #includeiostream #includestdio.h #includestring.h #includestdlib.h #includemath.h #includetime.h #includeiostream #includeassert.husing namespace std;class Date {// 友元函数声明friend ostream operator(ostream out, const Date d);friend istream operator(istream in, Date d);public:// 全缺省的构造函数Date(int year 1900, int month 1, int day 1);void Print() const;// 直接定义在类中他默认是inline// 频繁调用// 获取某年某月的天数int GetMonthDay(int year, int month){assert(month 0 month 13);static int monthDayArray[13] { -1,31,28,31,30,31,30,31,30,31,31,30,31 };if ((month 2) ((year % 4 0 year % 100 ! 0) || (year % 400 0)))return 29;else{return monthDayArray[month];}return monthDayArray[month];}bool CheckDate();// 不使用引用修改成员的都能加上 constbool operator(const Date d) const;bool operator(const Date d) const;bool operator(const Date d) const;bool operator(const Date d) const;bool operator(const Date d) const;bool operator!(const Date d) const;// 赋值运算符重载// d2 d3 - d2.operator(d2, d3)//Date operator(const Date d);// d1 100// 日期天数Date operator(int day);// d1 100// 日期天数Date operator(int day) const;// d1 - 100// 日期-天数Date operator-(int day);// d1 - 100;// 日期-天数Date operator-(int day) const;// d1 - d2// 日期-日期 返回天数int operator-(const Date d) const;// d1Date operator();// d1 - d1.operator(1)// 为了区分,构成了重载,给后置,强行增加了一个int形参// 这里不需要写形参名,因为接收值是多少不中呀,也不需要调用// 这个参数仅仅是为了前缀和后缀区分而存在的Date operator(int);// --d1Date operator--();// d1--Date operator--(int);流插入//void operator(ostream out);// 不建议, 因为Date* this占据了一个参数位置, 使用dcout不符合习惯// private:int _year;int _month;int _day; };// 重载 ostream operator(ostream out, const Date d); istream operator(istream in, Date d);1.1 GetMonthDay函数获取某年某月的天数 // 获取某年某月的天数 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 }; // 闰年检查如果月份是2月并且年份是闰年则返回29天 if (month 2 ((year % 4 0 year % 100 ! 0) || (year % 400 0))) { return 29; } // 如果不是2月或年份不是闰年返回静态数组中存储的对应月份的天数 else { return monthDayArray[month]; } } 问这个函数为什么不和其他的函数一样放在Date.cpp文件中实现呢 内联函数的优化在类定义中直接实现的成员函数默认为内联函数inline。内联函数通常用于减少函数调用的开销因为它们在编译时会被“内联”到调用它们的代码中。GetMonthDay 函数可能预计会被频繁调用这对于小型、频繁调用的函数特别有益可以提高程序的执行效率。 1.2 CheckDate函数检查日期有效性、Print函数打印日期 bool Date::CheckDate() {if (_month 1 || _month 12 // 检查_month成员变量是否小于1或大于12|| _day 1 || _day GetMonthDay(_year, _month))// 检查_day成员变量是否小于1// 调用GetMonthDay(_year, _month)获取当前年份和月份对应的天数并检查_day是否大于这个值 {return false;}else{return true;} }// Date类的构造函数用于初始化Date对象 Date::Date(int year, int month, int day) {_year year;_month month;_day day;// 调用CheckDate函数检查日期是否合法if (!CheckDate()){cout 日期非法 endl;} }// 打印日期 void Date::Print() const {cout _year - _month - _day \n; } 1.3 实现日期类的逻辑运算符重载 只需实现两个运算符就能借助这两个运算符去简易的实现其他运算符。 运算符的重载 // d1 d2 bool Date::operator(const Date d) const {if (_year d._year)return true;else if (_year d._year){if (_month d._month)return true;else if (_month d._month){return _day d._day;}}return false; }运算符重载 // d1 d2 bool Date::operator(const Date d) const {return _year d._year _month d._month _day d._day; } 其他运算符重载  // d1 d2 bool Date::operator(const Date d) const {return *this d || *this d; }bool Date::operator(const Date d) const {return !(*this d); }bool Date::operator(const Date d) const {return !(*this d); }bool Date::operator!(const Date d) const {return !(*this d); } 1.4 日期与天数加减操作符重载 // d1 day 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; }// 1970以后 // d1 - 100 Date Date::operator-(int day) {if (day 0){return *this -day;}_day - day;while (_day 0)// 借位{--_month;if (_month 0){_month 12;_year--;}//借上一个月的天数_day GetMonthDay(_year, _month);}return *this; } 和 - 是复合赋值运算符。功能复合运算符直接修改调用它们的对象。在Date类的上下文中 运算符将指定的天数加到当前日期上并直接修改该日期对象。同样- 运算符从当前日期中减去指定的天数。效率由于不需要创建新对象复合运算符在性能上可能更高效特别是在需要频繁更新日期的场景中。 Date Date::operator-(int day) const {Date tmp *this;tmp - day;return tmp; }Date Date::operator(int day) const {Date tmp *this;tmp day;return tmp; } 和 - 是普通运算符。功能普通运算符不直接修改调用它们的对象而是返回一个新的对象该对象是原始对象与指定值进行运算后的结果。效率由于需要创建新对象因此在性能上可能略低于复合运算符。 1.5 日期相减时的操作符重载 // d1 - d2 int Date::operator-(const Date d) const {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; } 当前对象的日期早于传入的日期对象。此时将max设置为dmin设置为*this并将flag设置为-1。这意味着最终的天数差将是负数。  在while循环体内每次迭代都会对min进行自增操作通过运算符重载实现同时计数器n也自增。这个过程会一直持续到min和max相等即两个日期相同为止。 1.6 前置运算符和后置运算符实现的区别 // d1 Date Date::operator() {*this 1;return *this; }// d1 - d1.operator(1) // 为了区分,构成了重载,给后置,强行增加了一个int形参 // 这里不需要写形参名,因为接收值是多少不重要,也不需要调用 // 这个参数仅仅是为了前缀和后缀区分而存在的 Date Date::operator(int) {Date tmp(*this);*this 1;return tmp; }// --d1 Date Date::operator--() {*this - 1;return *this; }// d1-- Date Date::operator--(int) {Date tmp *this;*this - 1;return tmp; } 为了区分构成了重载,给后置强行增加了一个int形参。 Date Date::operator(int) 这里不需要写形参名因为接收值是多少不重要也不需要调用。 这个参数仅仅是为了前缀和后缀区分而存在的。 前置运算符的语义是“先操作再返回”。 语义上前置运算符的语义是先对对象进行递作然后返回操作后的对象。这里的关键是“操作后的对象”。效率返回引用避免了不必要的创建和返回对象的拷贝。在C中对象的复制可能是一个昂贵的操作。链式操作通过返回引用可以支持链式操作。例如可以这样写代码--date anotherDate; 注意this指向的对象函数结束后不会销毁故以引用方式返回提高效率 后置运算符的语义是“先返回再操作”。 语义上后置运算符的语义是先返回操作后的对象然后对对象进行递作。后置运算符的关键在于返回操作前的状态。安全性返回拷贝还避免了潜在的外部修改此时得到的是一个独立的值而不是对原始数据的直接引用。原始数据没有影响。前置和后置都是一元运算符为了让前置与后置形成能正确重载 C规定后置重载时多增加一个int类型的参数但调用函数时该参数不用传递编译器自动传递。注意后置是先使用后1因此需要返回1之前的旧值故需在实现时需要先将this保存一份然后给this 1。而temp是临时对象因此只能以值的方式返回不能返回引用 1.7 输入输出流重载 // 友元函数声明声明后可访问私有成员变量 friend ostream operator(ostream out, const Date d); friend istream operator(istream in, Date d);// 重载输出流操作符用于将Date对象以特定格式输出到输出流中 ostream operator(ostream out, const Date d) {// 向输出流中输出Date对象的年份、月份和日期并添加中文字符和换行符进行格式化out d._year 年 d._month 月 d._day 日 endl;// 返回输出流的引用以便支持链式调用return out; }// 重载输入流操作符用于从输入流中读取数据并设置到Date对象中 istream operator(istream in, Date d) {cout 请依次输入年月日:;in d._year d._month d._day;// 调用Date对象的CheckDate()方法检查输入的日期是否合法 if (!d.CheckDate()){cout 日期非法 endl;}// 返回输入流的引用以便支持链式调用return in; }为什么参数顺序为(ostream out, const Date d)? 标准的流插入运算符 是左结合的也就是说左侧应该是流对象如 cout右侧是我们想要输出的对象如 Date。改变参数顺序后调用方式也必须相应改变即 cout这与常规用法不符。 标准库中的 operator 已经定义好了左侧是 ostream右侧是要输出的对象。改变参数顺序后编译器不会再将其识别为流插入运算符导致无法正常使用链式调用等特性。 将 operator 的参数顺序反过来会导致函数不能正常作为流插入运算符使用破坏标准库的调用方式和使用习惯。 二、const成员 将const修饰的“成员函数”称之为const成员函数const修饰类成员函数实际修饰该成员函数隐含的this指针表明在该成员函数中不能对类的任何成员进行修改。我们来看看下面的代码 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout Print() endl;cout year: _year endl;cout month: _month endl;cout day: _day endl endl;}void Print() const{cout Print()const endl;cout year: _year endl;cout month: _month endl;cout day: _day endl endl;} private:int _year; // 年int _month; // 月int _day; // 日 }; void Test() {Date d1(2022, 1, 13);d1.Print();const Date d2(2022, 1, 13);d2.Print(); } 请思考下面的几个问题 1. const对象可以调用非const成员函数吗  const对象不能调用非const成员函数。 当你将一个对象声明为const时实际上是在承诺不会修改这个对象的状态。因此只能对这个对象调用const成员函数因为这些函数承诺不会修改对象的状态。 2. 非const对象可以调用const成员函数吗 非const对象可以调用const成员函数。 const成员函数的主要目的是确保函数不会修改对象的状态。因此对于非const对象即可以修改的对象来说调用const成员函数是安全的因为即使对象本身可以被修改const成员函数也承诺不会修改它。 3. const成员函数内可以调用其它的非const成员函数吗  不可以。在const成员函数中不能直接调用同一个类的非const成员函数。原因是const成员函数承诺不会修改对象的状态而如果它调用了非const成员函数就会违背这个承诺因为非const成员函数可能会修改对象。 然而有一种情况可以间接调用非const成员函数那就是如果你将对象的const性质通过const_cast去除然后调用非const成员函数。但这种做法是不推荐的因为它破坏了const的正确性和对象的常量性质可能导致未定义行为或程序错误。通常来说应该尽量避免这种做法。 总结来说const成员函数内不能直接调用非const成员函数以保持const成员函数的承诺不修改对象状态。 4. 非const成员函数内可以调用其它的const成员函数吗 是的非const成员函数内部可以调用const成员函数。 const成员函数的主要特点是它不会修改调用它的对象的状态。因此从逻辑上讲在可以修改对象状态的非const成员函数中调用一个不会修改对象状态的const成员函数是安全的。 三、取地址及const取地址操作符重载  这两个默认成员函数一般不用重新定义 编译器默认会生成。 class A { public:// 我们不实现编译器会自己实现我们实现了编译器就不会自己实现了// 一般不需要我们自己实现// 除非不想让别人取到这个类型对象的真实地址A* operator(){cout A* operator() endl;return nullptr;}const A* operator() const{cout const A* operator() const endl;return (const A*)0xffffffff;} private:int _a1 1;int _a2 2;int _a3 3; };int main() {A aa1;const A aa2;cout aa1 endl;cout aa2 endl;return 0; } 这两个运算符一般不需要重载使用编译器生成的默认取地址的重载即可只有特殊情况才需 要重载比如想让别人获取到指定的内容 今天就先到这了 看到这里了还不给博主扣个 ⛳️ 点赞☀️收藏 ⭐️ 关注 你们的点赞就是博主更新最大的动力 有问题可以评论或者私信呢秒回哦。
http://www.tj-hxxt.cn/news/232759.html

相关文章:

  • 外贸一站式推广服务专门做照片的网站
  • 快速建网站的软件宝安网站建设 名匠
  • 网站域名在哪里注册新手学建设网站书籍
  • 网站开发的关键计算机资源计划seo优化网
  • 一个企业网站如何能放到互联网上 vps企业网站推广成功案例
  • 曲靖 曲靖网站建设软件(app)开发做网站在哪个程序做
  • 乐山网站建设如何做网站关键词霸屏
  • 网络科技有限公司网站90后小姑娘做网站
  • 免费网站优化Sensei wordpress插件
  • 做网站都需要哪些软件济南会做网站的公司
  • 企业网站管理系统下载萝岗电子商务网站建设
  • 把网站做到wordpress里面去excel做的最好的网站
  • 网站建设前期费用管理类网站开发价格
  • 小学网站怎么做数字化管理咨询
  • 银川网站建设网站怎么做图片轮播
  • 网站服务器一年的费用logo设计的最好的公司
  • 网站遭到攻击 运维怎么做济南建设网站哪里好
  • 焦作 做 网站西安有哪些网站建设公司
  • 网站设计包括哪些步骤自己做网站有什么意义
  • 用户网站建设渠道网络是什么意思
  • 建设银行网站不能登录密码错误建设网页
  • 做企业网站为什么要服务器呢佛山营销型网站建设
  • 舆情网站直接打开海口网站运营托管咨询
  • 兰州财经大学网站开发与维护成都市房产信息网
  • 无需域名网站建设网站调用wordpress
  • 网站建设如何快速增加用户光纤做网站 移动不能访问电信
  • 图片设计师网站wordpress外观插件
  • 网站建设服务合同样本为公益组织做网站
  • 广东省做网站推广公司wordpress静态分离
  • 不想花钱做网站推广现代简约装修三室两厅两卫样