const成员函数、cout/cin和重载运算符<<、>>、

目录

一、为什么cout,cin可以自动识别类型?

二、留提取运算符重载(<<)

三、留插入运算符重载(>>)

四、对上述的总结:

五、const成员

成员函数原则:

六、默认成员函数-取地址操作符重载


一、为什么cout,cin可以自动识别类型?

我们知道cout是ostream类的对象,cin是istream类的对象,并且流插入运算符“<<”只能用于内置类型,不能用于自定义类型。

为什么可以用于自定义类型呐?

如下:

是因为C++进行了运算符重载,然后又通过函数重载,所以可以自动识别不同内置类型。

二、留提取运算符重载(<<)

想要自定义类型也可以用留提取运算符,此时需要自己定义留提取运算符重载。

void operator<<(iostream& out)
{
	out << _year << "年" << _month << "月" << _day << "日";
}

但此时我们会发现,如下情况:

会发现p1在运算符左边,cout对象在右边。

原因在于:双操作数的运算符规定,第一个参数是左操作数,第二个参数是右操作数。而运算符重载函数的第一个形参被this指针隐式占用了,ostream类对象的引用在第二个形参位置,所以在调用运算符重载使,只能是this指针指向的对象在运算符的左边,cout对象在运算符的右边,但这又不符合留提取的含义。

为了解决这一问题,有如下方法:

将运算符重载创建为全局函数:

这样就不存在this指针占用的问题,可以将形参位置条调换,就可以像正常情况那样调用运算符重载。

接着又产生一个问题,运算符重载不在是类的成员函数,而大多数情况成员变量都会定义为私有或保护,这就导致,运算符重载不能使用成员变量,此时有如下解决方法:

(1)、创建getX,setX等等成员函数,间接使用成员变量;

(2)、将运算符重载设置为类的友元函数。

上述问题明白后,这里又有一个新的问题:

日常的运算符是支持链式调用的,所以我们还需要完成这个操作。

很显然,这是返回值的问题,我们返回cout对象的引用out就可以了;

ostream& operator<<(ostream& out,Date& d)
{
	out << d._year << "年" << d._month << "月" << d._day << "日";
	return out;
}

三、留插入运算符重载(>>)

istream& operator>>(istream& in, Date& d)
{
	cin >> d._year >> d._month >> d._day;
	return in;
}

注意事项与cout类似。

四、对上述的总结:

(1)、其他运算符一般实现为成员函数,而=运算符必须实现为成员函数,<<、>>运算符必须实现为全局函数,这样才能让流对象作为第一个参数,才符合可读性;

(2)、流本质是为了解决自定义类型的输入和输出,这弥补了C语言的printf和scanf不能操作自定义类型的不足;

五、const成员

const 修饰的 成员函数 称之为 const 成员函数 const 修饰类成员函数,实际修饰该成员函数 隐含的 this 指针 ,表明在该成员函数中 不能对类的任何成员进行修改。(const Date* this)。
看如下情况:
我们发现当对象p1被修饰成const后就不能正常调用成员函数。
原因在于p1被const修饰后,&p1为(const Date*)类型,而普通成员函数的this指针是(Date*)类型,这属于将权限放大问题,this指针就不能正常接收实参。
此时我们规定如下:
在成员函数的后面加一个const(若函数的声明和定义是分开的,就声明和定义后面都需要加const)就可以将this指针改为(const Date*)类型。
再如下:
一般的类对象可以调用const成员函数,这属于权限缩小,是可以被允许的。

成员函数原则:

1.能定义成const的成员函数都应该定义成const,这样const对象和非const对象都可以调用。

2.要修改成员变量的成员函数,不能定义成const。(例如++运算符重载里面可能会改变成员变量day、month、year,而const成员函数的this指针是(const Date*)类型,看const位置就知道是解引用不能修改,也就是成员变量不能被修改。)。

3.注意<<、>>运算符重载后面不能用const修饰,因为在后面用const修饰的是*this,而这两个运算符重载不是成员函数,不存在this指针。

4.普通成员函数和const成员函数的this指针类型不同,所以是可以构成函数重载的。

六、默认成员函数-取地址操作符重载

实现如下:

Date* operator&()
{
	return this;
}
const Date* operator&()const
{
	return this;
}

虽然看起来函数名一样,但参数类型不一样,因为下者后面被const修饰了,所以this指针是(const Date*)类型,而上者this指针是(Date*)类型,所以参数类型不一样,可以构成重载。

注意:该成员函数时默认采用函数,若没有显示定义,编译器会自动生成默认成员函数。所以平时&可以直接用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Object类

Object类 概念&#xff1a;Object类是所有类的父类&#xff0c;也就是说任何一个类在定义时候如果没有明确的指定继承一个父类的话&#xff0c;那么它就都默认继承Object类&#xff0c;因此Object类被称为所有类的父类&#xff0c;也叫做基类/超类。 常用方法 方法类型描述eq…

Python实战开发及案例分析(12)—— 模拟退火算法

模拟退火算法&#xff08;Simulated Annealing&#xff09;是一种概率搜索算法&#xff0c;源自于金属退火过程。在金属退火中&#xff0c;通过缓慢降低温度&#xff0c;金属内部的原子能够从高能态逐步达到较低能态。模拟退火算法利用类似的原理&#xff0c;通过随机搜索和概率…

Samtec连接器应用科普 | 连接智能工厂中的AI

【摘要/前言】 本文是系列的第一部分&#xff0c;我们将探讨人工智能在工业领域的作用。 人工智能&#xff08;AI&#xff09;的话题最近成为头条新闻&#xff0c;因为最新一代基于云的人工智能工具有望为机器的力量带来重大飞跃。在所有关于人工智能将如何影响我们的讨论中&…

Android内核之Binder消息处理:binder_transaction用法实例(七十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

overflow:hidden对解决外边距塌陷的个人理解

外边距塌陷&#xff1a; 子元素的上外边距大于父元素的上外边距&#xff0c;导致边距折叠&#xff0c;取两者之间最大值&#xff0c;即子元素外边距&#xff0c;导致父元素上外边距失效。 解决办法&#xff1a;在父元素样式添加overflow:hidden;或者border:1px solid black;(不…

Python数据分析实战

文章目录 第1关&#xff1a;读取MoMA数据集第2关&#xff1a;计算艺术家年龄第3关&#xff1a;把年龄换算成年代第4关&#xff1a;总结年代数据第5关&#xff1a;将变量插入字符串第6关&#xff1a;创建艺术家频率表第7关&#xff1a;创建显示艺术家信息的函数第8关&#xff1a…

Ubuntu下halcon软件的下载安装

由于工作需求&#xff0c;点云配准需要使用halcon进行实现&#xff0c;并且将该功能放入QT界面中 1.下载halcon 进入halcon官网进行下载 官网链接&#xff1a;https://www.mvtec.com/products/halcon/ 注意&#xff1a;要注册登陆之后才能进行下载 接着点击Downloads->H…

SOCKET编程(3):相关结构体与函数

相关结构体与函数 sockaddr、sockaddr_in结构体 sockaddr和sockaddr_in详解 struct sockaddr共16字节&#xff0c;协议族(family)占2字节&#xff0c;IP地址和端口号在sa_data字符数组中 /* Structure describing a generic socket address. */ struct sockaddr {__SOCKADDR…

Apache POI入门学习

Apache POI入门学习 官网地址 excel中使用到的类读取excel表格内容表格内容maven依赖方式一测试结果 方式二测试结果 向excel中写入数据方式一方式二方式三测试结果 从 Excel 工作表中的公式单元格读取数据测试结果 Excel 工作表中写入公式单元格从受密码保护的Excel中读取数据…

Apple 发布新款 iPad Pro 和 iPad Air:性能和设计的巨大飞跃

Apple 发布新款 iPad Pro 和 iPad Air&#xff1a;性能和设计的巨大飞跃 概述 苹果公司最近的“Let Loose”活动在科技界掀起了轩然大波&#xff0c;推出了最新的 iPad Pro 和 iPad Air 型号&#xff0c;在性能、设计和功能方面取得了前所未有的改进。在本文中&#xff0c;我…

【XR806开发板试用】使用FDCM操作Flash记录开机次数

一、寻找系统分配的自定义用户数据地址 &#xff08;1&#xff09;XR806的Flash布局 如图1所示&#xff0c;FLASH的布局有两种&#xff1a; 1、没有开启OTA模式&#xff1b;Image1PaddingSysinfo 2、开启OTA模式&#xff1b;Image1PaddingSysinfoOTA area Image2 Padding 如图…

智算中心“火”了?引领算力发展新潮流

去年大模型的空前发展&#xff0c;人工智能也终于迎来了属于自己的“文艺复兴”&#xff0c;众多的模型相继发布&#xff0c;继而催生了整个行业对于智能算力需求的激增。 市场需求与技术驱动仿佛现实世界的左右脚&#xff0c;催动着世界文明的齿轮向前滚动。在全球经济角逐日…

django中的cookie与session

获取cookie request.COOKIE.GET 使用cookie response.set-cookie views.py from django.http import HttpResponse from django.shortcuts import render# Create your views here. def cookie_test(request):r HttpResponse("hello world")r.set_cookie(lan, py…

AQ6360 横河 光谱分析仪精华帖,收藏保存

AQ6360是一款由日本横河&#xff08;YOKOGAWA&#xff09;生产的光谱分析仪&#xff0c;其主要技术参数包括波长范围、波长精度和波长线性度等。AQ6360的波长范围为1200~1650nm &#xff0c;具有较高的波长精度&#xff0c;在1520~1580nm范围内为0.02nm&#xff0c;在1580~1620…

Colab/PyTorch - 001 PyTorch Basics

Colab/PyTorch - 001 PyTorch Basics 1. 源由2. PyTorch库概览3. 处理过程2.1 数据加载与处理2.2 构建神经网络2.3 模型推断2.4 兼容性 3. 张量介绍3.1 构建张量3.2 访问张量元素3.3 张量元素类型3.4 张量转换&#xff08;NumPy Array&#xff09;3.5 张量运算3.6 CPU v/s GPU …

从0开始学习python(六)

目录 前言 1、循环结构 1.1 遍历循环结构for 1.2 无限循环结构while 总结 前言 上一篇文章我们讲到了python的顺序结构和分支结构。这一章继续往下讲。 1、循环结构 在python中&#xff0c;循环结构分为两类&#xff0c;一类是遍历循环结构for&#xff0c;一类是无限循环结…

【工具推荐定制开发】一款轻量的批量web请求命令行工具支持全平台:hey,基本安装、配置、使用

背景 在开发 Web 应用的过程中&#xff0c;作为开发人员&#xff0c;为了确认接口的性能能够达到要求&#xff0c;我们往往需要一个接口压测工具&#xff0c;帮助我们快速地对我们所提供的 Web 服务发起批量请求。在接口联调的过程中&#xff0c;我们通常会用 Postman 等图形化…

气死!又被数据骗了!

做数据分析的人做的久了&#xff0c;就会自然而然产生一种想法&#xff0c;认为数据展示出来的东西一定是正确的。毕竟如果连我们自己都质疑数据分析的权威性和说服力&#xff0c;那我们数据分析人的工作不就成了白费功夫了嘛。 一开始&#xff0c;我也认为这是一条不可撼动的…

JVM认识之垃圾收集算法

一、标记-清除算法 1、定义 标记-清除算法是最基础的垃圾收集算法。它分为标记和清除两个阶段。先标记出所有需要回收的对象&#xff08;即垃圾&#xff09;&#xff0c;在标记完成后再统一回收所有垃圾对象。 2、优点和缺点 优点&#xff1a;实现简单缺点&#xff1a; 可能…

C++类和对象详解(一)

目录 面向过程和面向对象初步认识类的引入类的定义类的两种定义方式声明和定义全部放在类体中 声名定义分离 类的作用域成员变量命名规则建议访问限定符 类的封装类的实例化类对象模型类的对象大小的计算扩展 结构体内存对齐规则 感谢各位大佬对我的支持,如果我的文章对你有用,…
最新文章