【C++从0到王者】第五站:类和对象(中)const和取地址运算符重载

简介: 【C++从0到王者】第五站:类和对象(中)const和取地址运算符重载


一、const修饰this指针

我们继续使用之前实现的日期类,当我们写出如下代码的时候,我们可以观察到编译器报错了

这其实因为权限的放大,如下图所示,将const Date* 指针传给形参变成了Date 指针,这涉及了权限放大,而权限是不能放大的,所以才会报错
这里我们就期望,将形参的Date
改为const Date*。这样的话对于第一个就是权限的缩小,第二个是权限平移。是允许的。但是这个const如何加上去呢?C++就允许加到函数后面

成员函数加上const的好处就是普通对象和const对象都可以调用这个函数了。

那么所有的成员变量函数都需要加上const吗,不一定的,需要修改成员变量的值的函数是不可以加上const的

class Date
{
  //友元函数声明
  friend ostream& operator<<(ostream& out, const Date& d);
  friend istream& operator>>(istream& in, Date& d);
public:
  Date(int year = 1, int month = 1, int day = 1);
  void Print() const
  {
    cout << _year << '-' << _month << '-' << _day << endl;
  }
  bool operator<(const Date& x) const;
  bool operator==(const Date& x) const;
  bool operator<=(const Date& x) const;
  bool operator>(const Date& x) const;
  bool operator>=(const Date& x) const;
  bool operator!=(const Date& x) const;
  int GetMonthDay(int year, int month) const;
  Date& operator+=(int day);
  Date& operator-=(int day);
  Date operator+(int day) const;
  Date operator-(int day) const;
  Date& operator++();
  Date operator++(int);
  Date& operator--();
  Date operator--(int);
  int operator-(const Date& d) const;
private:
  int _year;
  int _month;
  int _day;
};

二、取地址运算符重载以及const取地址运算符重载

这两个默认成员函数一般不用重新定义 ,编译器默认会生成。

class Date
{
public:
  Date(int year = 2023, int month = 1, int day = 1)
  {
    _year = year;
    _month = month;
    _day = day;
  }
  Date* operator&()
  {
    cout << "Date* operator&()" << endl;
    return this;
  }
  const Date* operator&() const
  {
    cout << "const Date* operator&() const" << endl;
    return this;
  }
private:
  int _year;
  int _month;
  int _day;
};
int main()
{
  Date d1;
  const Date d2;
  cout << &d1 << endl;
  cout << &d2 << endl;
  return 0;
}

这两个函数一般是不需要我们写的,因为编译器知道是如何取一个地址的,这两个默认成员函数只不过是为了圆之前的一个说法,所有的自定义类型都需要运算符重载,因为编译器不知道他们是怎么操作的

一般来说只有一种情况需要重载,也就是不想让别人取到我们的地址,如下代码所示

Date* operator&()
  {
    cout << "Date* operator&()" << endl;
    //return this;
    return nullptr;
  }
  const Date* operator&() const
  {
    cout << "const Date* operator&() const" << endl;
    return this;
  }


好了,本期内容就到这里了

如果对你有帮助的话,不要忘记点赞加收藏哦!!!

相关文章
|
6天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
33 4
|
8天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
27 4
|
30天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
21 1
|
30天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4
|
30天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
23 4
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
1月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
23 3
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
53 1
|
1月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
19 1