C嘎嘎~~[类 下篇 之 日期类的实现]

简介: C嘎嘎~~[类 下篇 之 日期类的实现]

6.const成员

6.1 const成员的引入

class Date
{
public:
    // 构造函数
  Date(int year = 2023, int month = 5, int day = 5)
  {
    _year = year;
    _month = month;
    _day = day;
  }
  void Print()
  {
    cout << _year << " " << _month << " " << _day << endl;
  }
private:
  int _year;
  int _month;
  int _day;
};
int main()
{
  Date d1(2023, 5, 8);
  d1.Print(); // 可以运行
  const Date d2(2023, 5, 9);
  d2.Print(); // error C2662: “void Date::Print(void)”: 
             // 不能将“this”指针从“const Date”转换为“Date &”
}

为什么会出现这种情况? 报错中的 “不能将 this指针从 const Date 转换为 Date&” 是什么意思??

6db54990019240349f583cd26257aff5.png

那么该如何解决这种权限的放大问题呢??

8bf584c321634ba5ba6db3df84900e01.png

我们知道 this指针是不在 行参和实参中显示的, 车门是焊死的; 那我们如何把const 加到 this指针上呢?

这时候我们的祖师爷就引入了 const成员


6.2const成员的概念

将const 修饰的成员函数称为 const成员函数, 实际上const 修饰的是隐含的 this指针⇒ 表明在该成员函数中不能对类的任何成员进行修改


class Date
{
public:
    // 构造函数
  Date(int year = 2023, int month = 5, int day = 5)
  {
    _year = year;
    _month = month;
    _day = day;
  }
  void Print() const
  {
    cout << _year << " " << _month << " " << _day << endl;
  }
private:
  int _year;
  int _month;
  int _day;
};
int main()
{
  Date d1(2023, 5, 8);
  d1.Print(); 
  const Date d2(2023, 5, 9);
  d2.Print(); 
}
*****
2023 5 8
2023 5 9
*****

通过前面的例子, 我们不难发现: const函数是挺好用的⇐ 普通对象 和 const对象 都能调用 const成员函数.

那么我们嫩不嫩将每一个成员函数都变成 const成员函数?? ⇐ 答案是显而易见的: 当然是不能的, 因为有些成员函数是要去修改成员变量的, 变成 const成员函数就不能对成员变量进行修改了

只要成员函数内部不修改成员变量, 那么就用 const成员函数


补充:


指针 和 引用有权限一说, 而其他的没权限一说~

7.日期类的实现


相关文章
|
3月前
|
存储 C++
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
39 2
|
3月前
|
C++
C++番外篇——日期类的实现
C++番外篇——日期类的实现
172 1
|
4月前
|
前端开发 JavaScript
前端基础(十五)_时间对象、字符串对象
本文介绍了JavaScript中时间对象的操作方法,包括获取和设置年、月、日、小时、分钟、秒等,以及如何格式化时间显示,同时提及了字符串对象的常用方法。
36 0
前端基础(十五)_时间对象、字符串对象
|
5月前
|
Java API 索引
【Java基础面试二十四】、String类有哪些方法?
这篇文章列举了Java中String类的常用方法,如`charAt()`、`substring()`、`split()`、`trim()`、`indexOf()`、`lastIndexOf()`、`startsWith()`、`endsWith()`、`toUpperCase()`、`toLowerCase()`、`replaceFirst()`和`replaceAll()`,并建议面试时展示对这些方法的熟悉度,同时深入理解部分方法的源码实现。
【Java基础面试二十四】、String类有哪些方法?
|
5月前
|
编译器 C++
【CPP】手把手教会日期类,日期类实现思路,详细思路
【CPP】手把手教会日期类,日期类实现思路,详细思路
|
8月前
|
存储 编译器 C语言
【C++初阶(六)】类和对象(中)与日期类的实现
【C++初阶(六)】类和对象(中)与日期类的实现
67 1
|
编译器 C++
C++类和对象 练习小项目---日期类的实现.
C++类和对象 练习小项目---日期类的实现.
90 0
|
安全 编译器
如何实现一个完整的日期类?
Tip 关于内联函数:在类内定义的函数,如果代码量少的话,编译器会酌将其转换成内联函数,这样会在调用的地方直接展开,能够提高效率。 在这个日期类中,提高的效率不是很大,所以在本文将日期类的成员函数的声明和定义分离了。如果想写成内联,需要直接在类里面定义。(内联的声明和定义不能分离)
|
算法 编译器 C++
类和对象实操之【日期类】
在学完类和对象相关知识后,需要一个程序来供我们练习、巩固知识点,日期类就是我们练习的首选程序,日期类实现简单且功能丰富,相信在完整地将日期类实现后,能对类和对象有更好的掌握及更深的理解
91 0
类和对象实操之【日期类】
|
Java API
Java常用日期类(包含三代)_Date类及Calendar类等
从JDK 1.0出现。 表示一个日期和时间,精确到毫秒,内部getTime()从1970年1月1号开始算。
115 0