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

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

在这里插入图片描述

👦个人主页:@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;
}

【程序结果】

在这里插入图片描述

相关文章:

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

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…...

代驾公司如何管理司机

在这个几乎人人都能学车&#xff0c;人人都能开车的时代&#xff0c;代驾职业也越来越专业化和正规化。因此&#xff0c;想要成为一名优秀的代驾司机&#xff0c;一定得有过人之处&#xff0c;对于代驾公司来说&#xff0c;如何管理司机也是尤为的重要。 对于代驾公司来说&…...

面了一个5年经验的测试工程师,自动化都不会也敢喊了16k,我也是醉了····

在深圳这家金融公司也待了几年&#xff0c;被别人面试过也面试过别人&#xff0c;大大小小的事情也见识不少&#xff0c;今天又是团面的一天&#xff0c; 一百多个人都聚集在一起&#xff0c;因为公司最近在谈项目出来面试就2个人&#xff0c;无奈又被叫到面试房间。 整个过程…...

ChatGPT:你真的了解网络安全吗?浅谈攻击防御进行时之网络安全新定义

ChatGPT&#xff1a;你真的了解网络安全吗&#xff1f;浅谈网络安全攻击防御进行时 网络安全新定义总结 ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;美国OpenAI 研发的聊天机器人程序&#xff0c;是人工智能技术驱动…...

LeetCode_DFS_困难_1377.T 秒后青蛙的位置

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给你一棵由 n 个顶点组成的无向树&#xff0c;顶点编号从 1 到 n。青蛙从 顶点 1 开始起跳。规则如下&#xff1a; 在一秒内&#xff0c;青蛙从它所在的当前顶点跳到另一个未访问过的顶点&#xff08;如果它…...

第四十九天学习记录:C语言进阶:结构体

结构体 结构体的声明 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量 struct tag {member-list; }variable-list;问&#xff1a;C的new和C语言的结构体有什么异同&#xff1f; ChatAI答&#xff1a; C中的new是一个运算符&#xff…...

LeeCode [N字形变换]算法解析

关键字&#xff1a;数学归纳法 一、题目 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I I G Y I R …...

CPU性能提升:流水线

一条指令的执行一般要经过取指令&#xff0c;翻译指令&#xff0c;执行指令3个基本流程。CPU内部的电路分为不同的单元&#xff0c;取指但愿&#xff0c;译码单元&#xff0c;执行单元等。指令的执行也是按照流水线工序一步步执行的。如图2-34所示&#xff0c;我们假设每一个步…...

C语言指针初级

目录 一、什么是指针 二、指针和指针类型 三、野指针 1.野指针的成因&#xff1a; 2.如何规避野指针 四、指针运算 1.指针-整数 2. 指针之间的加减 五、二级指针 六、指针数组 一个男人&#xff0c;到底要走多少的路&#xff0c;才能成为一个真正的男人 本专栏适用于…...

C++的历史

C是一种广泛使用的编程语言。C于1983年由丹尼斯里奇&#xff08;Dennis Ritchie&#xff09;在贝尔实验室创造&#xff0c;它是C语言的扩展。C的设计初衷是为了提高代码的可重用性和可维护性。它允许开发人员使用面向对象编程&#xff08;OOP&#xff09;范例&#xff0c;这使得…...

保姆级别!!!--全网绝对教你会!!教你如何使用MQTTFX连接阿里云平台中的设备----下期告诉你如何创建!

本期需要下载的软件 MQttfx安装包&#xff0c;本人打包的-嵌入式文档类资源-CSDN文库 目录 第一步&#xff1a;建造阿里云设备 这个可以先忽略建造步骤&#xff0c;下期将提供步骤。 第二步&#xff1a;下载mqttfx软件 第三步&#xff1a;填写密钥信息进行连接 查看三元…...

Unexpected token ‘‘‘, “‘{“type“:““... is not valid JSON

尝试低代码schema解析JSON时报错,奇怪的是控制台解析正常,项目js执行JSON.parse()报错,简直无语了,,, 只能挨个检查了,首先温习了下JSON 的标准格式: JSON的合法符号:{(左大括号) }(右大括号) "(双引号) :(冒号) ,(逗号) [(左中括号) ](右中括号) JSON字符串:…...

关于C语言的杂记5

文章目录 引入正文内部函数与外部函数相关数组的知识点数组的初始化测试一维数组在内存中存储的地址&#xff1a;遍历二维数组的值测试二维数组的地址(观察内存情况)数组下标为0开始的由来 两个数交换位置的三种方法 引入 写在前面&#xff1a;关于C语言这部分内容&#xff0c;…...

YOLOv5 vs YOLOv6 vs YOLOv7目标检测模型速度和准确度的性能比较——深入研究

如果您正在进行目标检测项目,您很可能会选择众多 YOLO 模型中的一种。从现有的 YOLO 对象检测模型的数量来看,如何选择最佳模型是一个艰难的选择。 您可能会发现自己正在考虑: 选择哪种 YOLO 模型以获得最佳 FPS? CPU 与 GPU 的推理速度如何?选择哪种 GPU?微型、小型、…...

如何增加网站权重?有效提高网站权重的技巧方法

权重对于网站优化来说非常的重要&#xff0c;那什么是网站权重呢&#xff1f;网站权重是指搜索引擎给网站&#xff08;包括网页&#xff09;赋予一定的权威值&#xff0c;对网站&#xff08;含网页&#xff09;权威的评估评价。一个网站权重越高&#xff0c;在搜索引擎所占的份…...

路径规划 | 图解快速随机扩展树RRT算法(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 什么是RRT算法?2 图解RRT算法原理3 算法仿真与实现3.1 ROS C++实现3.2 Python实现3.3 Matlab实现0 专栏介绍 🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);…...

【Stable Diffusion WebUI】一篇文章教你如何安装和使用Stable Diffusion WebUI

文章目录 Stable Diffusion WebUI1. 安装1.1 下载 stable-diffusion-webui1.2 运行 webui.sh 2. 安装插件2.1 命令行安装2.2 extensions 安装2.3 常用插件 3. 使用教程3.1 页面布局3.3 快捷栏设置3.3.1 PNG Info3.3.2 Tagger Stable Diffusion WebUI 1. 安装 1.1 下载 stable…...

Python篇——数据结构与算法(第二部分)

目录 二、排序算法&#xff08;承接第一部分&#xff09; 1、堆排序算法——树的基础知识补充 2、树的基本概念 3、二叉树基础知识 &#xff08;1&#xff09;满二叉树 &#xff08;2&#xff09;完全二叉树 &#xff08;3&#xff09;二叉树的存储方式&#xff08;表示方式…...

人工智能之读懂CNN卷积神经网络

通过往期文章的分享,我们了解了神经网络的结构,一般分为输入层,隐藏层,输出层 TensorFlow神经网络 那什么是卷积神经网络那,这就要我们追溯一下人类识别图像的原理 人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现…...

go手写Redis(1)之协议说明

手写Redis 参考大佬的go实现redis&#xff0c;自己实现一个简单版本的用于学习go以及网络编程相关 https://github.com/HDT3213/godis https://coding.imooc.com/class/576.html #慕课网课程 源码地址&#xff1a; https://gitee.com/haijun1998/go_redis RESP协议 Redis Ser…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...