文章目录
- 一、const修饰this指针
- 二、取地址运算符重载以及const取地址运算符重载
一、const修饰this指针
我们继续使用之前实现的日期类,当我们写出如下代码的时候,我们可以观察到编译器报错了
  这其实因为权限的放大,如下图所示,将const Date* 指针传给形参变成了Date 指针,这涉及了权限放大,而权限是不能放大的,所以才会报错
这其实因为权限的放大,如下图所示,将const Date* 指针传给形参变成了Date 指针,这涉及了权限放大,而权限是不能放大的,所以才会报错
  这里我们就期望,将形参的Date改为const Date*。这样的话对于第一个就是权限的缩小,第二个是权限平移。是允许的。但是这个const如何加上去呢?C++就允许加到函数后面
这里我们就期望,将形参的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;
	}

好了,本期内容就到这里了
 如果对你有帮助的话,不要忘记点赞加收藏哦!!!


















