zoukankan      html  css  js  c++  java
  • &的重载(取地址符操作符的重载和引用的重载)

    一、当为取地址操作符重载

      取地址成员函数是“类的六大默认成员函数之一”。其分为两种,普通取地址操作符和const取地址操作符。

      取地址是什么意思呢?就是返回当前对象的地址,对于成员函数来讲,this指针就是它的地址。

      将'&'重载重载为成员函数时,是否需要传参?

    Date* operator&() {
     
    }

      '&'运算符是一个单目运算符,且是一个前置单目运算符,可以看到它是不需要传参的,但我们知道成员函数的第一个参数为this指针,只是无需书写出来。

    【实例】

     1 #include <iostream>
     2 using namespace std;
     3 
     4 class Date
     5 {
     6 public:
     7     //构造函数
     8     Date(int year,int month,int day)
     9     {
    10         _year = year;
    11         _month = month;
    12         _day = day;
    13     }
    14     //拷贝构造函数
    15     Date(const Date& d)
    16     {
    17         _year = d._year;
    18         _month = d._month;
    19         _day = d._day;
    20     }
    21 
    22     //&操作符重载
    23     Date* operator&()
    24     {
    25         cout << "Date* operator&()" << endl;
    26         return this;
    27     }
    28     //前一个const表明返回值为一个const Date对象的指针,后一个const表明该成员函数为一个常量成员函数
    29     //可以被一个常量对象调用
    30     //常量对象只能调用常量成员函数,别的成员函数不能调用
    31     const Date* operator&() const
    32     {
    33         cout << "const Date* operator&()" << endl;
    34         return this;
    35     }
    36 private:
    37     int _year;
    38     int _month;
    39     int _day;
    40 };
    41 
    42 int main(int argc,char* argv[])
    43 {
    44     Date d1(2021,3,7);
    45     const Date d2(2021,3,31);
    46 
    47     Date* pd1 = &d1;
    48     const Date* pd2 = &d2;
    49     return 0;
    50 }

       如果不写这两个函数,编译器会帮助默认生成,若无其它操作完全够用了,因为这两个函数默认只返回this指针,也没有其它的操作。如果你有其它需求,可以重载实现,否则不实现也没有关系。

    (二)&也可以是引用的重载

     1 #include <iostream>
     2 using namespace std;
     3 
     4 class Date
     5 {
     6 public:
     7     //构造函数
     8     Date(int year,int month,int day)
     9     {
    10         _year = year;
    11         _month = month;
    12         _day = day;
    13     }
    14     //拷贝构造函数
    15     Date(const Date& d)
    16     {
    17         _year = d._year;
    18         _month = d._month;
    19         _day = d._day;
    20     }
    21 
    22     //&操作符重载
    23     Date* operator&()
    24     {
    25         cout << "Date* operator&()" << endl;
    26         return this;
    27     }
    28     //前一个const表明返回值为一个const Date对象的指针,后一个const表明该成员函数为一个常量成员函数
    29     //可以被一个常量对象调用
    30     //常量对象只能调用常量成员函数,别的成员函数不能调用
    31     const Date* operator&() const
    32     {
    33         cout << "const Date* operator&()" << endl;
    34         return this;
    35     }
    36 
    37     //int& 引用的重载
    38     operator int&()
    39     {
    40         return _year;
    41     }
    42 private:
    43     int _year;
    44     int _month;
    45     int _day;
    46 };
    47 
    48 int main(int argc,char* argv[])
    49 {
    50     Date d1(2021,3,7);
    51     const Date d2(2021,3,31);
    52 
    53     Date* pd1 = &d1;
    54     const Date* pd2 = &d2;
    55 
    56     int& year = d1;
    57     cout << "year = " << year << endl;
    58     return 0;
    59 }

       可以看到year值为d1对象中成员变量_year的值。

      个人理解:

    int& year = d1;等价于 int& year = (int&)d1;而因为重载了int&,所以返回了成员变量_year的值

      

    それでも私の大好きな人
  • 相关阅读:
    DNS 访问 Service【转】
    Service IP 原理【转】
    通过 Service 访问 Pod【转】
    定时执行 Job【转】
    并行执行 Job【转】
    Job 失败了怎么办?【转】
    用 k8s 运行一次性任务【转】
    运行自己的 DaemonSet【转】
    python之路——递归函数
    尝试加载 Oracle 客户端库时引发 BadImageFormatException
  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/14494876.html
Copyright © 2011-2022 走看看