&的重载(取地址符操作符的重载和引用的重载)
一、当为取地址操作符重载
取地址成员函数是“类的六大默认成员函数之一”。其分为两种,普通取地址操作符和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的值
それでも私の大好きな人