【C++】六个默认成员函数——取地址重载,const成员函数

🍅

初始化和清理

拷贝复制

目录

☃️1.取地址重载

☃️2.const取地址操作符重载


    这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容!

☃️1.取地址重载

class Date
{
public:
	Date* operator&()
	{
		return this;
	}
	
private:
	int _year; // 年
	int _month; // 月
	int _day; // 日
};

就是取地址的操作符   进行了运算符重载..... 也很简单直接返回对应的this指针即可, 所以直接使用编译器默认生成的就行

☃️2.const取地址操作符重载

class Date
{
public:
	Date* operator&()
	{
		return this;
	}
	const Date* operator&()const
	{
		return this;
	}
private:
	int _year; // 年
	int _month; // 月
	int _day; // 日
};

这里涉及到const修饰的成员函数 —— const成员函数(const加在函数名的后面)

实际上他修饰的是该成员函数隐含的this指针,表示该成员函数中不能对类的任何成员修改

class Date
{
public:
	Date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << "Print()" << endl;
		cout << "year:" << _year << endl;
		cout << "month:" << _month << endl;
		cout << "day:" << _day << endl << endl;
	}
	const void Print() const
	{
		cout << "Print()const" << endl;
		cout << "year:" << _year << endl;
		cout << "month:" << _month << endl;
		cout << "day:" << _day << endl << endl;
	}
private:
	int _year; // 年
	int _month; // 月
	int _day; // 日
};
void Test()
{
	Date d1(2022, 1, 13);
	d1.Print();
	const Date d2(2022, 1, 13);
	d2.Print();
}

 

可以发现,实例化的时候加上const才会去调用const成员函数

因为说到加上const(函数后),该对象的this指针被const修饰

即 对于这句代码

const void Print() const

实际上第一个const的意思是,返回值是常量不可以被修改

第二个const属于const成员函数,修饰该对象的this指针

const void Print(const Date* this) 

由于C++中权限缩小现象,d2对象只能调用const成员函数,因为d2被const修饰,d2中的任何成员都不能修改

const Date d2(2022, 1, 13);

可以看到,如果写了一个成员函数用来改变成员变量——year

d1可以 d2不行

总结:

d2的this指针在实例化的时候已经被const修饰,d2成员只有可读属性,所以只会去调用const成员函数—— const对象不可以调用非const成员函数(权限不能放大),只能调用const成员函数 

非const对象可以调用const成员函数(权限可以缩小),只需要调用的时候编译器自动在成员前加上const即可

 const成员函数内不可以调用其它的非const成员函数吗(权限不能放大)
非const成员函数内可以调用其它的const成员函数(权限可以缩小)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值