【C++类和对象】const成员函数及流插入提取

💞💞 前言

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
在这里插入图片描述

💥个人主页:大耳朵土土垚的博客
💥 所属专栏:C++入门至进阶
这里将会不定期更新有关C++的内容,希望大家多多点赞关注收藏💖💖

前面我们学习过六大默认成员函数中的四个——构造函数与析构函数以及拷贝构造与赋值运算符重载,今天我们继续学习剩下的成员函数——取地址与const取地址操作符重载。

目录

  • 💞💞 前言
  • 1.const成员函数
  • 2.取地址以及const取地址操作符重载
  • 3.流插入流提取运算符重载
  • 4.结语

1.const成员函数

  • const成员函数是指在函数声明和定义时使用const关键字修饰的成员函数。使用const修饰的成员函数不能修改类的成员变量,也不能调用非const成员函数。

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

  • const成员函数的声明语法为:void functionName() const;

在const成员函数中,对成员变量的修改会导致编译错误。例如:

class MyClass {
public:void modifyVar() const {myVar = 5; // 编译错误}
private:int myVar;
};

在使用const对象调用const成员函数时,会调用const版本的函数。而使用非const对象调用const成员函数时,会调用非const版本的函数。例如:

class MyClass {
public:void nonConstFunc() {// do something}void constFunc() const {// do something}
};
//上面这两个函数构成函数重载意义在于不同对象调用不同的函数
int main() {MyClass obj1;const MyClass obj2;obj1.nonConstFunc(); // 调用非const版本的函数obj2.constFunc(); // 调用const版本的函数obj2.nonConstFunc(); // 编译错误,const对象不能调用非const版本的函数return 0;
}

const成员函数的作用是保证在函数内部不会修改类的成员变量,从而更好地实现了类的封装性和安全性。

注意:

  • const成员函数内不可以调用其它的非const成员函数

在const成员函数内是不允许调用非const成员函数的。因为const成员函数被声明为const,它承诺了不会修改类的成员变量。如果在const成员函数内部调用非const成员函数,那么就可能会导致成员变量的被修改,违反了const成员函数的约定。

  • 非const成员函数内可以调用其它的const成员函数

非const成员函数内可以调用其他的const成员函数。const成员函数表示该函数不会修改类的成员变量,因此在非const成员函数内调用const成员函数是安全的。

  • const对象不可以调用非const成员函数

const对象的成员函数被隐式地视为const成员函数,因此只能调用const成员函数,而不能调用非const成员函数。

  • 非const对象可以调用const成员函数

总结:
只读函数可以加const,其内部不涉及修改生成,便于const和非const对象的调用;而涉及对象修改生成的函数就不可以加const。

2.取地址以及const取地址操作符重载

  • 这两个默认成员函数一般不用重新定义,编译器默认会生成;
  • 在C++中,使用&操作符可以取得一个对象的地址。对于const对象,也可以使用&操作符来取得其地址;
  • 在C++中,可以重载&操作符,假设有一个类Date,可以在类中重载&操作符,如下所示:
class Date
{ 
public :Date* operator&(){return this ;}const Date* operator&()const{return this ;}
private :int _year ; // 年int _month ; // 月int _day ; // 日
};

这两个运算符一般不需要自己去写,使用编译器生成的默认取地址的函数即可,只有特殊情况,才需要手动生成,比如想让别人获取到指定的内容就可以自己定义返回的指针。

3.流插入流提取运算符重载

  • 在C++中,可以通过重载流插入流提取运算符(<< 和 >>)来自定义输入输出操作。
  • 流插入运算符(<<)用于将数据插入到输出流中。它的重载函数应该以ostream&类型作为返回值,并以一个 ostream&类型的参数(通常是输出流对象)和要输出的数据作为参数。
  • 流提取运算符(>>)用于从输入流中提取数据。它的重载函数应该以 istream&类型作为返回值,并以一个 istream&类型的参数(通常是输入流对象)和要提取到的数据的引用作为参数。
  • 在C++中流插入提取操作符重载是不可以重载成成员函数,因为它们参数的顺序不可以改变,例如:
    在这里插入图片描述

这是因为流插入第一个运算符是cout,而如果将其重载为成员函数第一个参数就是类和对象中隐含的this指针,所以参数顺序不匹配,我们只能将其重载成全局函数;与此同时流插入运算符和流提取运算符通常都是以友元函数的形式定义在类的声明内部,这允许它们访问类的私有成员。

如下面代码所示:

#include<iostream>
using namespace std;
class Date
{
public://流插入流提取//友元函数允许非成员函数访问私有对象friend ostream& operator<<(ostream& out, const Date& d);friend istream& operator>>(istream& in, Date& d);
private:int _year = 1900;int _month= 1;int _day = 1;
};
//流插入提取
ostream& operator<<(ostream& out, const Date& d)
{out << d._year<< "/" << d._month << "/" << d._day << endl;return out;
}
istream& operator>>(istream& in, Date& d)
{in >> d._year >> d._month >> d._day;return in;
}int main()
{Date d1;cin >> d1;cout << d1;return 0;
}

结果如下:
在这里插入图片描述

4.结语

在类和对象的成员函数中只读函数可以加const,因为其内部不涉及修改生成;取地址与const取地址这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载;此外流插入运算符和流提取运算符通常都是以友元函数的形式定义在类的声明内部,这允许它们访问类的私有成员。以上就是今天的所有内容啦~ 完结撒花 ~🥳🎉🎉

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

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

相关文章

Elasticsearch 开放 inference API 增加了对 OpenAI chat completions 的支持

作者&#xff1a;Tim Grein 我们很高兴地宣布在 Elasticsearch 中推出的最新创新&#xff1a;在 Elastic 的 inference API 中集成了 OpenAI Chat Completions 功能。这一新特性标志着我们在整合尖端人工智能能力至 Elasticsearch 的旅程中又迈出了一步&#xff0c;提供了生成类…

凭证自动拆分

凭证自动拆分 一、设置拆分中间科目 OBX2配置凭证拆分的中间科目 二、销售开票凭证拆分 SE18创建BADI "FI_BILL_ISSUE_SPLIT"的实施 修改实施类&#xff1a;ZCL_FI_BILL_ISSUE_SPLIT中IF_EX_FI_BILL_ISSUE_SPLIT~ACTIVATE_AUTOMATIC_SPLIT方法&#xff0c;代码…

ruoyi-vue前端的一些自定义插件介绍

文章目录 自定义列表$tab对象打开页签关闭页签刷新页签 $modal对象提供成功、警告和错误等反馈信息&#xff08;无需点击确认&#xff09;提供成功、警告和错误等提示信息&#xff08;类似于alert&#xff0c;需要点确认&#xff09;提供成功、警告和错误等提示信息&#xff08…

vue 的生命周期--图解

生命周期函数中的this指向是vm 或 组件实例对象。 常用的生命周期钩子&#xff1a; mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】。beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】。 关于销毁Vue实例 销毁后借助Vu…

常见排序算法(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序,基数排序,桶排序)

一.排序的概念 1.排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作 2.稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排…

MATLAB设置变量

您可以通过简单的方式分配变量。例如&#xff0c; 示例 x 3 %定义x并用值初始化它 MATLAB将执行上述语句并返回以下结果- x 3 它创建一个名为x的1乘1矩阵&#xff0c;并将值3存储在其元素中。再举一个实例&#xff0c; 示例 x sqrt(16) %定义x并用表达式初始化它 MATLAB将…

自动化测试Selenium(3)

目录 WebDriver相关API 打印信息 打印title 打印url 浏览器的操作 浏览器最大化 设置浏览器的宽,高 操作浏览器的前进, 后退, 刷新 控制浏览器滚动条 键盘事件 键盘单键用法 键盘组合按键用法 鼠标事件 WebDriver相关API 打印信息 打印title 即打印该网址的标题.…

在PostgreSQL中,如何创建一个触发器并在特定事件发生时执行自定义操作?

文章目录 解决方案示例代码1. 创建自定义函数2. 创建触发器 解释 在PostgreSQL中&#xff0c;触发器&#xff08;trigger&#xff09;是一种数据库对象&#xff0c;它能在特定的事件&#xff08;如INSERT、UPDATE或DELETE&#xff09;发生时自动执行一系列的操作。这些操作可以…

css-Echarts图表初始显示异常非完全显示

1.echarts图表初始加载异常 2.问题原因 初次加载时&#xff0c;由于外层使用%比 echarts dom元素没有完全加载完成&#xff0c;canvas绘画继承本身宽高&#xff0c;造成Echarts图表初始显示异常非完全显示。 3.使用echarts图表可参考以下代码&#xff08;实现一定的自适应&am…

MyBatis 核心配置讲解(上)

大家好&#xff0c;我是王有志&#xff0c;一个分享硬核 Java 技术的互金摸鱼侠。 前两篇的文章中我们分别介绍了 MyBatis 和 MyBaits 的应用组成&#xff0c;到这里基础篇的内容就结束了。 从今天开始&#xff0c;我们正式进入 MyBatis 学习的第二阶段&#xff1a;MyBatis 的…

【Qt 学习笔记】Qt常用控件 | 显示类控件LCD Number的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 显示类控件LCD Number的使用及说明 文章编号&#xff1a…

stm32中的中断优先级

在工作中使用到多个定时器中断,由于中断的中断优先级不熟悉导致出错,下面来写一下中断的一些注意事项。 一、中断的分类 1、EXTI外部中断:由外部设备或外部信号引发,例如按键按下、外部传感器信号变化等。外部中断用于响应外部事件,并及时处理相关任务。 2、内部中断:…

Matlab对多个输入信号进行数值排序提取特定值

1、将多个信号转为一个数组信号输出&#xff0c;在这里需要注意&#xff0c;数据类型是否统一&#xff1b; 2、使用Sort模块&#xff0c;进行排序&#xff08;可设置排序方向&#xff09;&#xff0c;得到排序后的新数组以及对应的索引号&#xff1b; 3、设置想要的索引号&…

12.事件参数

事件参数 事件参数可以获取event对象和通过事件传递数据 获取event对象 <template><button click"addCount">Add</button><p>Count is: {{ count }}</p> </template> <script> export default {data() {return {count:0…

6.SpringBoot 日志文件

文章目录 1.日志概述2.日志作用3.使用和观察日志3.1如何观察日志3.2使用日志3.3日志级别3.4日志持久化3.5日志分割 4.日志框架4.1门面模式(外观模式)4.2 SLF4J框架介绍4.3 日志格式的说明4.3.1日志名称 5.日志颜色设置6.总结 大家好&#xff0c;我是晓星航。今天为大家带来的是…

SpringMvc的核心组件和执行流程

一、 springmvc的核心组件及作用 1.DispatcherServlet:前置控制器&#xff0c;是整个流程控制的核心&#xff0c;用来控制其他组件的执行&#xff0c;降低了其他组件的耦合性 2.Handler:控制器&#xff0c;完成具体的业务逻辑&#xff0c;当DispatcherServlet接收到请求后&am…

Pages by User Role for WordPress:强化内容访问控制的必备插件

在数字化时代&#xff0c;WordPress已成为众多网站开发者和设计师的首选平台。然而&#xff0c;如何根据用户角色精确控制内容的访问权限&#xff0c;一直是困扰他们的难题。Pages by User Role for WordPress插件应运而生&#xff0c;为这一难题提供了完美的解决方案。 Pages …

力扣HOT100 - 23. 合并K个升序链表

解题思路&#xff1a; 只要会合并两个升序链表&#xff0c;合并K个做法类似。 class Solution {public ListNode mergeKLists(ListNode[] lists) {ListNode res null;for (int i 0; i < lists.length; i) {res merge(res, lists[i]);}return res;}public ListNode merg…

使用动画做一个走马灯的案例

走马灯 1.第一步-搭建环境 先搭建父盒子。父盒子里面再放入一个子盒子用来装7张图片&#xff0c;有因为图片在一行上了&#xff0c;所以需要使用flex布局。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><me…

【人工智能基础】知识表示和专家系统

目录 一、知识 知识 产生式表示法 产生式表示形式 确定的事实性知识的产生式表示 不确定的事实性知识的产生式表示 确定的规则知识的产生式表示 不确定的规则知识的产生式表示 产生式系统构成 优点 缺点 语义网络 优点 缺点 框架 框架的一般结构 框架的继承 优…