我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++类中const修饰的成员函数及日期类怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++类中const修饰的成员函数及日期类怎么使用

这篇文章主要介绍“C++类中const修饰的成员函数及日期类怎么使用”,在日常操作中,相信很多人在C++类中const修饰的成员函数及日期类怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++类中const修饰的成员函数及日期类怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    一.const修饰类的成员函数

    1.问题引出:

    给出一段简单的代码

    代码段:

    #include <iostream>using std::cin;using std::cout;using std::endl; class Date1{public:Date1(int year = 2000)             类的全缺省构造函数(可无参调用){_year = year;} void Prin(){cout << "Print Date:" << _year << endl;} private:int _year;};   int main(){const Date1 a;                       定义一个const修饰的对象a(该对象只可读,不可被写入)a.Prin(); return 0;}

    该段程序会编译报错:

    C++类中const修饰的成员函数及日期类怎么使用

    2.问题分析

    上述代码段出错的原因要从类的成员函数的隐含参数this指针出发进行分析:

    C++类中const修饰的成员函数及日期类怎么使用

    注意:

    • 由于a是const修饰的对象,因此&a 取出的是 const Date *类型的指针,该指针只可对a对象的内存空间进行读取操作而不可进行写入操作(该指针的权限为只可读取不可写入)。

    • Prin函数的形参是Date * const this指针,该类型指针同时具有读取和写入内存空间的权限。

    • 将&a赋给Prin的形参this,就会使指针的读写权限被放大,因此编译无法通过(指针是灵活而危险的存在,编译器只允许其读写权限被缩小而不允许其权限被放大)

    3.const修饰类的成员函数 

    我们知道类的每个成员函数都有一个隐含的this指针形参(类型为:类名*const this)。

    为了使被const修饰的对象(比如是上面代码段中的a)可以调用其成员对象,C++规定可以用const来修饰类的成员函数。

    类中被const修饰的“成员函数”称为const成员函数,const修饰类成员函数,本质上修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员变量进行修改。(修饰后成员函数的this指针形参类型变为:const 类名* const this)

    比如:

    C++类中const修饰的成员函数及日期类怎么使用

    C++类中const修饰的成员函数及日期类怎么使用

    const修饰的对象不可以调用非const修饰的成员函数(类指针传参给this指针时读写权限被放大):

    C++类中const修饰的成员函数及日期类怎么使用

    非const修饰的对象可以调用const修饰的成员函数(类指针传参给this指针时读写权限被缩小):

    C++类中const修饰的成员函数及日期类怎么使用

    const修饰的成员函数内不可以调用其它的非const修饰的成员函数(this指针之间传参时读写权限被放大):

    C++类中const修饰的成员函数及日期类怎么使用

    非const修饰的成员函数内可以调用其它的const修饰的成员函数(this指针之间传参时读写权限被缩小):

    C++类中const修饰的成员函数及日期类怎么使用

    当类的成员函数中没有对类的成员变量进行任何形式的修改操作时,该成员函数最好都用const来修饰(这样安全同时又使得const修饰的对象可以调用该成员函数)以保证代码的健壮性。

    二. 类的两个默认的&运算符重载

    C++类中const修饰的成员函数及日期类怎么使用

    编译器会默认生成两个类的&(取地址)重载用于类的取地址操作(如果我们自定义了类的取地址重载则编译器便不会再生成默认的)

    C++中,内置运算符若要直接作用于类对象则必须经过重载。

    若想取到类对象的地址,我们可以对&运算符进行重载,比如:

    #include <iostream>using std::cin;using std::cout;using std::endl;   class Date1{public:    Date1(int year = 2000){_year = year;}  Date1* operator& ()               对&进行重载用于非const修饰的对象的取地址{return this;} const Date1* operator&() const    对&进行重载用于const修饰的对象的取地址{return this;} private:int _year;};  int main(){const Date1 a;                     定义一个const修饰的对象a(该对象只可读,不可被写入)    Date1 b; cout << &a << endl;cout << &b << endl; return 0;}

    C++类中const修饰的成员函数及日期类怎么使用

    C++类中const修饰的成员函数及日期类怎么使用

    这两个默认成员函数一般不用重新自定义 ,编译器默认会生成,编译其默认生成的&重载和上面我们自定义的成员函数应该没有什么区别(至少功能上没区别)。

    三. 日期类小练习 

    日期类头文件:

    为了提高代码的可维护性和可读性,将日期类的成员函数的声明和定义分开写。

    #pragma once#include <iostream>using std::cout;using std::cin;using std::endl; //记录日期的类class Date        {public: //Date的构造函数Date(int day=1, int month=1, int year=1);//获取月份天数的方法int GetMonthday(const int month) const;//类对象的日期打印函数void Print() const;//判断某个日期是星期几,并打印出来void GetWeekDay() const ;  //一组比较运算符的重载bool operator> (const Date& date)const;bool operator==(const Date& date)const;//在逻辑上我们只需定义出大于(或小于)和等于的判断函数,剩余的判断函数我们就可以通过复用的方        式简化代码书写bool operator<(const Date& date)const;bool operator>=(const Date& date)const;bool operator<=(const Date& date)const;bool operator!=(const Date& date)const; //一组日期+(-)整数的操作和+=(-=)整数的操作Date operator+(const int day)const;Date& operator+=(const int day);Date operator-(const int day)const;Date& operator-=(const int day);Date& operator=(const Date& date);//一组前置++(--)和后置++(--)的重载Date& operator++(); //实现日期类的前置++Date operator++(int); //实现日期类的后置++Date& operator--();                              //实现日期类的前置--Date operator--(int);                            //实现日期类的后置-- //实现时期相减的操作符重载int operator-(const Date& date)const;private:int _day;int _month;int _year; };

    日期类的成员函数的实现:

    #include "Date.h" //Date的构造函数Date ::Date(int day, int month, int year)   {_day = day;_month = month;_year = year;if (_year <= 0 || _month <= 0 || _month > 12 || _day <= 0 || _day > GetMonthday(_month)){cout << "date invalued please exit the app" << endl;exit(0);}}//获取相应月份天数的方法int Date::GetMonthday(const int month)const{static const int arr[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };int ret = arr[month - 1];if (((0 == _year % 4 && 0 != _year % 100) || (0 == _year % 400)) && 2 == month){ret++;}return ret;}//类对象的日期打印函数void Date::Print()const{cout << _year << ' ' << _month << ' ' << _day << ' ' << endl;}//判断某个日期是星期几,并打印出来//注意this指针不能由用户去传void Date::GetWeekDay()const{const char* arr[7] = { "星期一","星期二","星期三","星期四","星期五","星期六","星期日" };const Date tem(1, 1, 1900);const int subret = (*this)-tem;printf("%s\n", arr[(subret % 7)]);} //将 > 运算符进行重载bool Date ::operator> (const Date& date)const{if (_year > date._year){return true;}else if (_year == date._year && _month > date._month){return true;}else if (_year == date._year && _month == date._month && _day > date._day){return true;}return false;}//将 =运算符进行重载bool Date:: operator==(const Date& date)const{if (date._day == _day && date._month == _month && date._year == _year){return true;}return false;}//在逻辑上我们只需定义出大于(或小于)和等于的判断函数,剩余的判断函数我们就可以通过复用的方式简化代码书写bool Date :: operator>= (const Date& date)const{if ((*this) > date || (*this) == date){return true;}return false;} bool Date :: operator < (const Date& date)const{if ((*this) >= date){return false;}return true;} bool Date :: operator<=(const Date& date)const{if ((*this) > date){return false;}return true;}bool Date:: operator!= (const Date& date)const{if ((*this) == date){return false;}return true;} //一组日期+(-)整数的操作和+=(-=)整数的操作Date& Date::operator+=(const int day){if (day < 0){(*this) -= (-day);return (*this);}_day += day;while (_day > GetMonthday(_month)){if (_month < 12){_day -= GetMonthday(_month);_month++;}else{_day -= GetMonthday(_month);_year++;_month = 1;}}return (*this);}Date Date::operator+(const int day)const{Date tem(*this);tem += day;return tem;} Date& Date::operator-=(const int day){if (day < 0){(*this) += (-day);return (*this);}_day -= day;while (_day <= 0 ){if (_month > 1){_month--;_day += GetMonthday(_month);}else{_year--;_month = 12;_day += GetMonthday(_month);}}if (_year <= 0){cout << "operation invalued" << endl;exit(0);}return (*this);}Date Date::operator-(int day)const{Date tem(*this);tem -= (day);return tem;}Date& Date ::operator=(const Date& date){if (this != &date){_day = date._day;_month = date._month;_year = date._year;} return (*this);} //一组前置++(--)和后置++(--)的重载Date& Date ::operator++()             //实现日期类的前置++{(*this) += 1;return (*this);}Date Date ::operator++(int)           //实现日期类的后置++{Date tem(*this);(*this) += 1;return tem;}Date& Date:: operator--()             //实现日期类的前置--{(*this) -= 1;return (*this);}Date Date:: operator--(int)           //实现日期类的后置--{Date tem(*this);(*this) -= 1;return tem;} //实现时期相减的操作符重载int Date::operator-(const Date& date)const{int count = 0;Date min;if ((*this) < date){min = (*this);while (min != date){min++;count++;}return -count;}else{min = date;while (min != (*this)){min++;count++;}return count;}}

    到此,关于“C++类中const修饰的成员函数及日期类怎么使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    C++类中const修饰的成员函数及日期类怎么使用

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    C++类中const修饰的成员函数及日期类怎么使用

    这篇文章主要介绍“C++类中const修饰的成员函数及日期类怎么使用”,在日常操作中,相信很多人在C++类中const修饰的成员函数及日期类怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++类中co
    2023-07-05

    C++类中const修饰的成员函数及日期类小练习

    将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,表明在该成员函数中不能对类的任何成员进行修改,下面这篇文章主要给大家介绍了关于C++类中const修饰的成员函数及日期类小练习 的相关资料,需要的朋友可以参考下
    2023-01-28

    C++中类的默认成员函数怎么用

    这篇文章主要介绍了C++中类的默认成员函数怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。C++中,对于任意一个类,都会为我们提供4个默认的成员函数(如果我们不显示的去声
    2023-06-29

    C++中的成员函数和友元函数怎么使用

    成员函数是定义在类中的函数,它可以访问类中的成员变量和其他成员函数。成员函数使用类的对象来调用,并且隐式地访问该对象的成员。友元函数是在类外部定义的函数,它可以访问类的私有成员。友元函数可以在类中声明为友元,或者在类外部声明为友元。下面是成
    2023-08-16

    C++类中三大函数是什么及怎么使用

    本篇内容介绍了“C++类中三大函数是什么及怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一.构造函数1.构造函数的作用我们在创建好类
    2023-07-05

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录