当前位置: 首页 > article >正文

C++之“取地址运算符重载”

文章目录

  • const成员函数
  • 取地址运算符重载

const成员函数

在了解取地址运算符重载之前,我们先了解一下const成员函数。

何为const成员函数?

将const修饰的成员函数就是const成员函数。有一个不同点就是const修饰的成员函数的时候,const放在成员函数的最后面

class Data
{
public:
	Data(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print() const
	{
		std::cout << _year << "-" << _month << "-" << _day << std::endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	//这⾥⾮const对象也可以调⽤const成员函数是⼀种权限的缩⼩
    Data d1(2024, 7, 5);
	d1.Print();  
	//隐式的this指针类型是Data* this,&d1的类型是Data*,这两者相对应

	const Data d2(2024, 8, 5);
	d2.Print();
	//隐式的this指针类型是Data* this,&d2的类型是const Data*
	//const在*的左边(const Data*)代表const修饰的是指针所指向的内容。在*的右边,代表修饰的指针本身(有一次初始化的机会)
	//d2指向的内容,d2自己都不可以改变,而拷贝给Data* 类型的this之后,反倒可以改变了。这涉及权限的放大
	return 0;
}

所以我们需要将this指针的类型改为const Data* 类型。但this是编译器自动提供,我们无法改变。最后的办法是,在成员函数最后面加一个const。

加上const也是有好处的,普通对象也是可以调用它的。假如传过来的是Data*类型的,Data* 传给const Data* (权限是可以缩小的),你传过来的数据在我这边被const修饰,不能改变,挺好的嘞。

但并不是所有的成员函数都可以加上const。比如Data& operator++() 前置++这个函数,我们就是将传过来的参数进行++,但是用const修饰了,不能修改传过来的参数。所以,需要修改数据的成员函数就最好不要加const。

构造函数不可以加。

取地址运算符重载

一般情况下,不需要我们去定义取地址运算符重载。有时在特殊情况下需要,比如我们不想让别人取到当前类对象的地址,就可以自己实现一份,胡乱返回一个地址。
在这里插入图片描述
在没有取地址运算符重载的情况下,也可以取d1的地址,并将其输出,这是为什么呢?不是说自定义类型使用运算符需要重载吗?

可以往默认成员函数的方向思考。如果我们没有写取地址运算符重载的话,编译器会自动生成两种取地址运算符重载,这样就不用显式实现啦。

生成的是哪两种呢? 普通的取地址运算符重载,const取地址运算符重载
当对象是普通类型时,举个例子

//当某个成员函数的this指针是Data*类型的,则采用下面的取地址运算符重载
Data* operator&()
{
	return this;
}

当对象是const类型时:

//当某个成员函数的最后面加了const,则它的this指针是const Data*类型的,则采用下面的取地址运算符重载
const Data* operator&()const
{
	return this;
}

注意:当两个版本的取地址运算符重载都存在时,普通函数它不会去调用const版本的取地址,它会调用适合自己的。


http://www.kler.cn/a/376746.html

相关文章:

  • 【深入浅出】深入浅出Bert(附面试题)
  • vue3中使用vue-diff工具来比较数据差异
  • 海睿思产品体系二次开发能力介绍
  • Python 数据结构对比:列表与数组的选择指南
  • 研究了100个小绿书十万加之后,我们发现2024小绿书独家秘籍就是:在于“先抄后超,持续出摊,量大管饱”!
  • EasyWechat小程序红包
  • 从0开始的STM32之旅 7 串口通信(I)
  • idea 配置tomcat 服务
  • SpringBoot抗疫物资管理:系统开发与部署
  • 2024/11/2 安卓创建首页界面
  • 【MATLAB源码-第196期】基于matlab的A*融合DWA算法栅格路径规划仿真,画出路径图、姿态角度以及线角速度。
  • git入门教程2:git发展历史
  • 【ESP32】ESP-IDF开发 | PWM脉宽调制器+PWM波形输出和捕获例程
  • 架构师之路-学渣到学霸历程-37
  • 修复因Ubuntu升级导致无法联网的问题
  • 线程池学习之执行流程、拒绝策略、线程池状态
  • 心觉:别再等完美工具了!用“小米加步枪”也能战斗,边干边升级才是最强策略!
  • 搜索引擎算法更新对网站优化的影响与应对策略
  • Tenda路由器 敏感信息泄露
  • FreeRTOS工程编译缺失头文件freertos_mpool.h或freertos_os2.h
  • Leetcode 热题100 之 二叉树3
  • 结合无监督表示学习与伪标签监督的自蒸馏方法,用于稀有疾病影像表型分类的分散感知失衡校正|文献速递-基于生成模型的数据增强与疾病监测应用
  • 从0开始学PHP面向对象内容之(类,对象,构造/析构函数)
  • npm入门教程9:npm配置
  • Python爬虫:揭开淘宝商品描述的神秘面纱
  • 逼着自己深度思考