&的重载(取地址符操作符的重载和引用的重载)

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

  取地址成员函数是“类的六大默认成员函数之一”。其分为两种,普通取地址操作符和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的值

 

  

 

posted @ 2021-03-07 15:33  阿玛尼迪迪  阅读(1246)  评论(0编辑  收藏  举报