【C++初阶】类与对象(中)之取地址及const取地址操作符重载(了解即可)

news2024/11/24 8:31:45

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


目录

  • 一、const成员
  • 二、取地址及const取地址操作符重载
    • 2.1 特殊使用情况

一、const成员

const修饰的“成员函数”称之为const成员函数, const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

我们来看看下面的代码:

#include <iostream>
using namespace std;

class Date
{
public:
	Date(int year, int month, int day)
	{
		Year = year;
		Month = month;
		Day = day;
	}
	void Print(Date* const this)
	{
		cout << Year << "-" << Month << '-' << Day << endl;
	}
	
private:
	int Year; 
	int Month; 
	int Day; 
};

int main()
{
	Date d1(2023, 5, 20);
	d1.Print();

	const Date d2(2023, 5, 21);
	d2.Print();

	return 0;
}

在这里插入图片描述

  • 以上代码对于d2是编译不通过的,这是为什么呢?
  1. 当对象d1调用成员函数Print时,编译器会隐式自动地将该对象的地址作为第一个参数传递给成员函数,因此,在一个类的成员函数内部,可以使用this指针来访问该对象的成员变量和成员函数。this指针的类型:类名* const this,const修饰this,即成员函数中,不能修改this指针;
  2. 而对于对象d2,当调用成员函数时,编译器同样会自动将该对象作为第一个参数传递给成员函数,但不同的是,由于const修饰d2,因此this指针的类型应该是const Date* const this,因此不能给*this赋值,所以导致了报错。

因此,为了解决以上问题。C++是允许在函数后加上一个const,这样就能正常运行了:

#include <iostream>
using namespace std;

class Date
{
public:
	Date(int year, int month, int day)
	{
		Year = year;
		Month = month;
		Day = day;
	}
	void Print() const
	{
		cout << this->Year << "-" << this->Month << '-' << this->Day << endl;
	}
	
private:
	int Year; 
	int Month; 
	int Day; 
};

int main()
{
	Date d1(2023, 5, 20);
	d1.Print();

	const Date d2(2023, 5, 21);
	d2.Print();

	return 0;
}

【程序结果】

在这里插入图片描述

【总结】

  1. 成员函数在后加上const后,普通和const修饰的对象都能用
  2. 但注意:由于const修饰的对象,其形参中的*thisconst修饰,也就说明不能对*this进行修改。因此,如果成员函数内要修改对象成员变量的函数千万不要用const修饰对象。
  3. 如果声明和定义分离,声明的函数和定义的函数都要加const

二、取地址及const取地址操作符重载

首先先来看看一下代码:

#include <iostream>
using namespace std;

class Date
{
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
		Year = year;
		Month = month;
		Day = day;
	}
private:
	int Year; 
	int Month; 
	int Day; 
};

int main()
{
	Date d1(2023, 5, 20);
	const Date d2(2023, 5, 21);
	
	cout << &d1 << endl;
	cout << &d2 << endl;
	
	return 0;
}

【程序结果】

在这里插入图片描述

通过以上结果我们发现:const取地址操作符重载不用重新定义,编译器默认会生成。

当然,如果想自己定义也是可以的,代码如下:

#include <iostream>
using namespace std;

class Date
{
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
		Year = year;
		Month = month;
		Day = day;
	}
	
	Date* operator&()
	{
		return this;
	}
	
	const Date* operator&() const
	{
		return this;
	}

private:
	int Year; 
	int Month; 
	int Day; 
};

int main()
{
	Date d1(2023, 5, 20);
	const Date d2(2023, 5, 21);
	
	cout << &d1 << endl;
	cout << &d2 << endl;
	return 0;
}

【程序结果】

在这里插入图片描述

需要注意的是:重载const 取地址操作符时,返回的指针类型必须是const指针,否则会导致编译错误。

2.1 特殊使用情况

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

#include <iostream>
using namespace std;

class Date
{
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
		Year = year;
		Month = month;
		Day = day;
	}

	Date* operator&()
	{
		return nullptr;
	}

	const Date* operator&() const
	{
		return nullptr;
	}
private:
	int Year; 
	int Month; 
	int Day; 
};

int main()
{
	Date d1(2023, 5, 20);
	const Date d2(2023, 5, 21);
	cout << &d1 << endl;
	cout << &d2 << endl;
	return 0;
}

【程序结果】

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/549607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能Python-pythongroup

PythonGroup&#xff1a;提高Python技能和构建社交网络的绝佳平台 PythonGroup是一家致力于为Python编程者提供高质量资源和社交网络的平台。无论您是新手还是有十年以上的经验&#xff0c;PythonGroup都可以帮助您提高您的技能&#xff0c;增加您的知识和职业发展机会。 Pyt…

t检验与Z检验的区别

在统计学中&#xff0c;假设检验是评估某种特定情况下观察到的数据是否符合假设的一种方法。t检验和Z检验是两种常用的假设检验方法&#xff0c;分别用于比较均值差异以及比例差异。在医学统计中&#xff0c;t检验和Z检验经常被用于研究和比较不同治疗方法的效果&#xff0c;例…

chatgpt赋能Python-pythonfor遍历列表

Python for循环&#xff1a;遍历列表 - 提高您的编程技能 列表是Python编程语言中广泛使用的数据结构。在许多情况下&#xff0c;我们需要遍历列表中的元素。Python中的for循环是一种最常用的遍历列表的方式。在本文中&#xff0c;我们将介绍如何使用Python的for循环语句遍历列…

SSRS rdlc报表之创建报表 一

环境 vs2019 fromwork4.5 第一步 安装rdlc报表插件 vs2019使用rdlc&#xff0c;需要安装扩展插件&#xff0c;扩展→扩展管理→联机&#xff0c;搜索rdlc&#xff0c;安装Microsoft RDLC Report Designer&#xff0c;我在安装过程中&#xff0c;安装了很久都没安装成功&…

一、数据字典介绍

文章目录 一、数据字典介绍1、页面效果2、表设计3、数据分析4、根据页面效果分析数据接口 一、数据字典介绍 何为数据字典&#xff1f;数据字典就是管理系统常用的分类数据或者一些固定数据&#xff0c;例如&#xff1a;省市区三级联动数据、民族数据、行业数据、学历数据等&a…

Spring Boot系列(一):Spring Boot 入门篇

目录 对于学习Java的童鞋来说&#xff0c;可都是有用的博文&#xff0c;也是我悉心选择推荐给大家的。这次为大家带来的系列文章是关于Spring Boot的&#xff0c;Spring Boot对Javaer来说应该是很常用的一个框架。希望这个系列能对大家有用&#xff01;​编辑 快速入门 总结 …

C语言的位运算

1. 位操作符综述 位操作有逻辑运算和移位运算&#xff0c;如位与、位或、位取反、按位异或、移位等操作。位运算通常会和底层代码寄存器的操作结合在一起使用&#xff0c;比如想要让寄存器中的任意1位或者任意几位位设置为1&#xff0c;或者设置为0&#xff0c;从而实现对寄存…

chatgpt赋能Python-pythongame怎么样

Python Game&#xff1a;打造属于自己的游戏 Python是一种全球流行的编程语言&#xff0c;因其简洁易懂、高效稳定&#xff0c;被广泛应用于各类软件、网站与游戏的开发领域。其中&#xff0c;Python Game成为许多开发者的关注焦点&#xff0c;不同于传统游戏开发的复杂与繁琐…

【音视频开发】摄像头和ISP的基本介绍

文章目录 一、摄像头的基本知识1.1 摄像头结构1.2 摄像头模组的种类1.3 摄像头的工作原理 二、Sensor的基本知识2.1 Sensor的工作原理2.2 Sensor的分类2.3 Sensor的封装形式2.4 常见的Sensor厂商2.5 Sensor的基本框图 三、ISP的基本知识3.1 ISP的定义3.2 ISP的工作原理 四、ISP…

拥抱生成式大模型 --- 提示工程篇

本文为系列的第二篇&#xff0c;主要是学习和总结chatgpt类模型的提示工程。感谢吴恩达老师的开源课程。 引言 随着大型语言模型&#xff08;LLM&#xff09;的发展&#xff0c;LLM 大致可以分为两种类型&#xff0c;即基础LLM和指令微调LLM。基础LLM是基于文本训练数据&…

栈和队列 - C语言实现

目录 栈 栈的概念 栈的实现 队列 队列的概念 队列的实现 栈 栈的概念 栈是一种后进先出 (LIFO - last in first out) 的数据结构&#xff0c;通常利用数组或链表实现。栈只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另…

JavaWeb14 - 异步请求 - 02 - Ajax

1. 概述 1.1 官方文档 Ajax 在线文档&#xff1a;https://www.w3school.com.cn/js/js_ajax_intro.asp 1.2 Ajax 基本介绍 1.2.1 Ajax 是什么 AJAX 即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML)Ajax 是一种浏览器异步发起请求(指定发哪些数据)&…

LeetCode刷题集(七)(LeetCode70.爬楼梯)

学习目标&#xff1a;拿下LeetCode70.爬楼梯 学习完本文章之后拿下LeetCode70题 题目实例&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 样例1、输入&#xff1a;n 2 输出&#xff1…

Java学习路线(7)——面向对象基础

1、概念 对象&#xff1a; 是实际存在的具体实例。类&#xff1a; 是对象共同特征的描述 。 2、类的组成 成员变量 成员变量是类中的全局变量&#xff0c;它的作用域是class car的“{}”之内。 public class car{String carTypeName; //汽车类型名称double minPrice; //最低…

OpenCV在iOS端的集成及Mat和UIImage互相转化(附源码)

OpenCV是一个非常强大的图形处理框架&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上&#xff0c;在自动驾驶、智能家居、人脸识别、图片处理等方面提供了非常丰富且功能强大的api&#xff0c;在图片处理方便&#xff0c;基本上可以满足对图片处理的所有需求…

Fourier分析入门——第4章——频率域

目录 第 4 章 频率域(The Frequency Domain) 4.1 频谱分析(Spectral Analysis) 4.2 物理单位(Physics units) 4.3 笛卡尔坐标形式与极坐标形式对比 4.4 频谱分析的复数形式 4.5 复数值Fourier系数 4.6 复数值的和三角的Fourier系数之间的关系 4.7 2维或多维离散Fouri…

SpringBoot+Redis实现浏览量+1

当用户点击新闻查看详情后&#xff0c;数据库新闻的浏览量字段要加一&#xff0c;当在高并发场景下&#xff0c;很多人查看新闻详情直接操作数据库使浏览量字段加一对数据库压力过大&#xff0c;并且容易造成脏数据&#xff0c;这里结合redis实现浏览量加一。 业务逻辑&#x…

chatgpt赋能Python-pythonfoo

Pythonfoo: 优秀的Python库提高开发效率 Python是一门被广泛应用的动态编程语言&#xff0c;提供了各种各样的库来帮助开发人员完成不同类型的任务。在这些Python库中&#xff0c;Pythonfoo是一款旨在提高开发效率和代码简洁性的出色的Python库。 什么是Pythonfoo&#xff1f…

一种用于超低功耗无线传感器网络的消息传递算法(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 无线传感器网络是由一定数量的无线传感器节点组成的网络系统,各节点可采集环境数据并通过无线通信进行数据传输,目前已广泛应用…

使用cubeMX生成USB HID设备

一&#xff0c;简介 本文主要介绍如何使用stm32F407开发板和cubeMX生成USB FS HID设备&#xff0c;供参考。 二&#xff0c;操作步骤 本次总共分以下几个步骤&#xff1a; 1&#xff0c;创建cubeMX工程&#xff0c;并配置HID&#xff0c;生成工程代码&#xff1b; 2&#xf…