<<和>>操作符、取地址重载、const关键字

文章目录
- 自定义类型<<和>>重载
- const关键字
- 取地址重载(类的默认构造函数)
自定义类型<<和>>重载
在内置类型中,<<和>>可以自动识别
在自定义类型冲,运算符重载,<<和>>也可以重载,我们首先来认识一下,<<和>>
//>>流插入 将键盘输入的内容,赋值到变量中
//<<流提取 将cout后面的内容输出到屏幕中int main()
{int a;double b;Date date;//自定义类型输出的形式,系统无法规定(自定义类型的成员变量不同),所以需要<<和>>重载cin>>a>>b;//系统可以自动识别类型cout<<a<<" "<<b<<endl;return 0;
}

<iostream>是C++中的输入输出流,istream是输入流,ostream是输出流(这样理解即可)
std::ostream::operator<<我们看到编译器对于内置类型进行了处理,接下来以Date类为例子,进行操作符<<重载
对于<<和>>总结
1.可以直接支持内置类型是因为库中实现了
2.可以直接支持自动识别类型是因为函数重载,传入对应类型的参数就可以调用对应的函数
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
//Date
class Date
{
public:void operator<<(ostream& out);//我们使用的成员函数,所以默认this占用一个成员形参,调用这个函数的形式为 对象名.operator<<(cout)Date(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};
void Date::operator<<(ostream& out)
{out << _year << " " << _month << " " << _day << endl;
}
int main()
{Date date1(2010, 10, 10);Date date2(1012, 1, 10);Date date3(2001, 10, 10);date1.operator<<(cout); //等同于date1<<cout//但是这一种明显不是我们需要的cout<<int 这种类型,所以我们要实现的是cout<<date1return 0;
}
为了实现cout<<date1 这样的写法,我们要使得ostream形参在前面,Date对象在后面,但是如果是在成员函数中,this对象总是占据第一个位置,date1.operator<<(cout) 实际上就是相当于,传递两个参数,第一个参数是this(date1),第二个参数才是为cout,所以为了解决这个问题(先调用cout(cout在前面)),我们应该使用全局函数
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
//Date
class Date //我们使用全局函数可以使得第一个参数为cout 从而实现cout<<date1
{ //但是全局函数不在类中,无法使用私有成员变量,所以我们应该使用friend(在不破化原有封装性的基础上,打开一个口子,只是使得这个函数成为类似于共有函数(可以访问d的私有成员))
public:friend ostream& operator<<(ostream& out, const Date& d);//传入形参为ostream类型,也就是输出流,传引用,那么Date(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};
//但是我们知道 cout<<int<<int 是库里支持的所以我们应该返回ostream来实现这个功能
ostream& operator<<(ostream& out, const Date& d)
{out << d._year << " " << d._month << " " << d._day << endl;//调用这个函数就可以输出我们规定的内容return out;
}//传引用返回
int main()
{Date date1(2010,10,10);Date date2(1012, 1, 10);Date date3(2001, 10, 10);cout << date1<<date2<<date3;return 0;
}
所以上面这个代码是最为符合库中对于内置类型的重载的,使用ostream&返回,并使用全局函数来实现cout在前,实例化成员在后,且可以连续<<
>>和<<是一个道理,都是istream&为返回值,然后使用传参先是istream& in 然后再是第二个参数const Date& d
//例子如下
class Date{public:friend istream& operator>>(istream& in,const Date& d);private:int _year;int _month;int _day;
};istream& operator>>(istream& in,const Date& d){//需要进行判断是否是合理的年月日,根据自定义类型成员变量的需求进行更改//这里就不去写判断日期是否合理int year, month, day;in >> year >> month >> day;}
int main()
{Date d;///然后就可以实现流插入————插入进去,流提取————提取出来cin>>d;Date d1,d2,d3;cin>>d1>>d2>>d3;return 0;
}
上文就是对于流插入和流提取的运算符重载,主要内容就是使用istream&/ostream& 引用返回,使得第一个变量位置给了istream& in/ostream& out,第二个形参位置给了自定义类型
iostream是c++的标准库,里面包括但不限于istream(标准输入类)ostream(标准输出类)
const关键字
const的基本用法为,修饰变量或者是指针,使得其不能改变数值,或指向
//在C++中多了一种对于const的用法
class Date{public:Date(int year,int month,int day){_year=year;_month=month;_day=day;}void Print() const //使用const来修饰的是this指针 也就是 const Date* this,使得this指向的成员变量不能被改变{cout<<_year<<"-"<<_month<<"-"<<_day<<endl;}private:int _year;int _month;int _day;
};
int main()
{return 0;
}
const修饰指针的时候,如:const Date* this,不能改变的是this的成员变量,指针的指向是可以变化的
const修饰变量的时候,如:Date* const this,不能改变的是指针的指向,但是this的成员变量是可以变化的
const同时修饰指针和变量的时候,如:const Date* const this,指针的指向和this的成员变量都不能改变

请思考下面的几个问题:
- const对象可以调用非const成员函数吗?
- 非const对象可以调用const成员函数吗?
- const成员函数内可以调用其它的非const成员函数吗?
- 非const成员函数内可以调用其它的const成员函数吗?
对于上述问题,我们通过下面代码测试的得到答案
1.const对象不能调用非const的成员函数
2.非const对象是可以调用非const修饰的成员函数/const修饰的成员函数
3.const成员函数内,不能调用非const成员函数
4.非const成员函数内,可以调用非const修饰的成员函数/const修饰的成员函数

#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;//在C++中多了一种对于const的用法
class Date {
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}void Print() const //使用const来修饰的是this指针 也就是 const Date* this,使得this指向的成员变量不能被改变{cout << _year << "-" << _month << "-" << _day << endl;//这是const修饰的成员函数Print2();//说明不能调用非const函数}void Print2() {Print();//说明可以调用const修饰的函数}void plus_year(){_year++;}private:int _year;int _month;int _day;
};
int main()
{Date d1(1, 1, 1);const Date d2(2, 2, 2);//创建两个变量,分别为非const和const修饰d1.Print();d2.Print();//调用const修饰的函数,说明是可以的d1.plus_year();d2.plus_year();//const修饰的成员不能调用非const修饰的成员return 0;
}
下面的对于const的一些小问题,权限可以变小,但是不能放大
int main()
{const int a=10;int b=a; //这一个是正确的,因为只是将a的数值拷贝赋值给b,b的改变不会影响a,所以正确const int c=10;int& d=c; //这是错误的,因为d引用c,使得d可以改变c(c不能被改变),const变量权限小于普通变量,涉及到权限放大,所以这是错误的const int e=10;int*pf=&e; //错误,这个和引用是类似的,都是涉及到权限放大return 0;
}
取地址重载(类的默认构造函数)
前面四个类中默认的成员函数都已经学习,我们来学习一下剩下这两个取地址重载的默认成员函数
取地址重载主要就是针对普通成员和const对象取地址,但是这两个会自己去实现,实际上使用默认的即可
class Date{public:Date* operator&() //对于普通成员{cout<<"非const"<<endl;return this;//取地址,返回的是指针类型}Date* operator&() const{cout<<"const"<<endl;return this;//对于const修饰的成员}
};
int main()
{Date d1;const Date d2;Date* d3=&d1;const Date* d4=&d2;return 0;
}

一般来说,使用编译器默认的取地址重载即可,但是对于一些特殊情况是可以使用取地址重载的,比如说,只是取出来这个this对象中某一成员变量的地址,获取指定的内容的时候

相关文章:
<<和>>操作符、取地址重载、const关键字
文章目录 自定义类型<<和>>重载const关键字取地址重载(类的默认构造函数) 自定义类型<<和>>重载 在内置类型中,<<和>>可以自动识别 在自定义类型冲,运算符重载,<<和>&…...
数学模型,如何计算概率?
既然是数学模型,那应该如何计算呢? 最简单的方法,当然就是用统计学的方法去计算了,简单说来,就是靠输入的上下文进行统计,计算出后续词语的概率,比如「你吃了晚饭了吗」,「你吃了」后面按照概率,名词如「饭」或「晚饭」等概率更高,而不太可能是动词,如「睡」「睡觉…...
【Ehcache技术专题】「入门到精通」带你一起从零基础进行分析和开发Ehcache框架的实战指南(Spring整合ehcache)
带你一起从零基础进行分析和开发Ehcache框架的实战指南(Spring整合ehcache) 回顾一下Ehcache主要的特性 Spring框架所支持的第三方缓存Spring Cache的实现方式Spring Cache基本准备工作定义Ehcache配置文件启用Spring-CacheXML风格的xml代码 JavaConfig注…...
合肥市2023年度高校毕业生“双千培养工程”培训项目学员招募公告
为贯彻落实人社部实施促进高校毕业生等青年就业创业推进计划要求,提升高校毕业生就业技能,拟开展高校毕业生“双千培养工程”培训项目。根据工作计划安排,现面向高校和社会招募学员参加培训,培训方向为大数据应用、PythonAI人工智…...
重写Properties类,实现对properties文件的有序读写,数据追加,解决中文乱码
前言 *.properties文件,是 Java 支持的一种配置文件类型,并且 Java 提供了 properties 类来读取 properties 文件中的信息。文件中以键值对 "键值"的形式,存储工程中会多次重复使用的配置信息,通过“Properties”类来读…...
态势感知与信质、信量
未来的新智能是人机环境系统智能,而人机融合的态势感知是其关键,简单地说,态势感知(situation awareness)就是智能体在“一定时间和空间环境中的元素的感知,对它们的含义的理解,并对他们稍后状态…...
20230508----重返学习-call()与bind()重写-JS中数据类型检测汇总-装箱与拆箱-类的多种继承方案
day-065-sixty-five-20230508-call()与bind()重写-JS中数据类型检测汇总-装箱与拆箱-类的多种继承方案 call()与bind()重写 call()重写 call()的作用例子 let obj {name: 珠峰培训 } const fn function fn(x, y, ev) {console.log(this, x, y, ev)return x y } let res f…...
Node.js对ES6 及更高版本的支持
目录 1、简介 2、默认情况下什么特性随着 Node.js 一起发布? 3、有哪些特性在开发中? 4、移除这个标记(--harmony)吗 5、Node.js 对应 V8 引擎 1、简介 Node.js 是针对 V8 引擎构建的。通过与此引擎的最新版本保持同步&…...
【华为OD机试2023】工作安排 100% C++ Java Python
【华为OD机试2023】工作安排 100% C++ Java Python 前言 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能最优),不能保证通过率。 Tips1:机试为ACM 模式 你的代码需要处理输入输出,input/cin接收…...
面试题Spring - 关于Spring的25个经典问题和答案
文章目录 1 什么是Spring框架?Spring框架有哪些主要模块?2 使用Spring框架能带来哪些好处?3 什么是控制反转(IOC)?什么是依赖注入?4 请解释下Spring框架中的IoC?5 BeanFactory和ApplicationContext有什么区…...
C++学习day--10 条件判断、分支
1、if语句 if 语句的三种形态 形态1:如果。。。那么。。。 #include <iostream> using namespace std; int main( void ) { int salary; cout << " 你月薪多少 ?" ; cin >> salary; if (salary < 20000) { cout <&…...
和月薪5W的聊过后,才发现自己一直在打杂···
前几天和一个朋友聊面试,他说上个月同时拿到了腾讯和阿里的offer,最后选择了阿里。 我了解了下他的面试过程,就一点,不管是阿里还是腾讯的面试,这个级别的程序员,都会考察项目管理能力,并且权重…...
SSM框架学习-AOP通知类型
在AOP中,通知(Advice)是对切点进行操作的方法,用于实现切面定义的具体逻辑。Spring框架支持五种类型的通知: 1. 前置通知(Before advice) 在连接点执行前,执行通知 Before("**…...
微信小程序原生开发功能合集十四:登录健权及注册功能实现
本章实现微信自动登录及注册修改功能,包括匿名账号生成、权限自动检测、注册界面及注册流程的实现。 另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下: 1. CSDN课程: https://edu.csdn…...
【Java零基础入门篇】第 ⑤ 期 - 抽象类和接口(二)
博主:命运之光 专栏:Java零基础入门 学习目标 1.了解什么是抽象类,什么是接口; 2.掌握抽象类和接口的定义方法; 3.理解接口和抽象类的使用场景; 4.掌握多态的含义和用法; 5.掌握内部类的定义方法…...
Halcon 集合运算(差集difference、交集intersection、并集union2、打散connection与 合集 union1)
文章目录 1 差集difference2. 交集intersection3. 并集union24 打散connection与 合集 union1 (二者互为反义词)4.1 打散connection与4.2 合集 union1 (注意与交集的区别)5 示例原图1 差集difference difference (Operator) Name difference — Calculate the difference …...
Allegro约束规则设计
首先是物理规则。 然后是间距规则。 如果有些特殊要求,还需要设计电气规则。 原则上,把规则设计好,然后把规则赋值给网络。 物理规则。PCS。 对于名字为DEFAULT的PCS,这是最基础的整板默认规则。 没有特殊要求的网络,…...
PyQt5桌面应用开发(11):摸鱼也要讲基本法之桌面精灵
本文目录 PyQt5桌面应用系列鼠标不要钱,手腕还不要钱吗?PyQt5源程序python文件资源定义界面定义文件 技术要素资源文件StyleSheetsQMainWindow设置窗体几何 结论 PyQt5桌面应用系列 PyQt5桌面应用开发(1):需求分析 PyQ…...
Talk预告 | 大连理工大学IIAU Lab在读博士生严彬:走向通用实例感知
本期为TechBeat人工智能社区第495期线上Talk! 北京时间5月10日(周三)20:00,大连理工大学IIAU Lab在读博士生—严彬的Talk将准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “走向通用实例感知”,届时将介绍和探讨通用实…...
2023-05-04 LeetCode每日一题(摘水果)
2023-05-04每日一题 一、题目编号 2106. 摘水果二、题目链接 点击跳转到题目位置 三、题目描述 在一个无限的 x 坐标轴上,有许多水果分布在其中某些位置。给你一个二维整数数组 fruits ,其中 fruits[i] [positioni, amounti] 表示共有 amounti 个水…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
