IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++运算符重载 -> 正文阅读

[C++知识库]C++运算符重载

C++运算符重载

重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。 一般参数列表根据运算符的特点进行设计。

返回值 operator运算符 (参数列表){
//function body
}

在这里给出一个技巧,我们可以把运算符看作函数名,例如:

a + b

我们可以看作:

operator+ (a,b);

再比如:

cout<<"Hello world";

我们可以看作:

operator<<(cout,"Hello world");
/*
function body:
ostream& operator(ostream& c1,string& s1){
	return c1<<s1;
}
*/

疑问:运算符重载,我们把运算符看作一个函数名,并且这个函数还有返回值,那么最后这个返回值给谁了?
比如我们跟上面一样重载了<<运算符,但是<<两边的cin和"Hello world"都是实参,而编写函数的时候我们返回了一个ostream类型的引用,问题是谁接收了这个引用?


在回答问题之前,我们可以想到:运算符重载,实际上就是将某个运算符通过基本运算符的组合,进而使其具有特定的效果。>

问题回答:

运算符重载中,返回值到底返回到哪了?以下面两个问题为例子来进行分析:

  1. 重载基本+运算符
struct data_{
	int hour;            //小时数
	double temperature;  //温度数
};


data_& operator+(const data_& d1,const data_& d2){
	//应考虑返回一个新的data_而不改变参与运算的变量的原值

	data_ D;
	D.hour = d1.hour + d2.hour;
	D.temperature = d1.temperature + d2.temperature;
	return D;
}

当我们重载基本的+运算符的时候,我们应该不改变运算符两边变量的值,而应返回目标类型的新对象,而且在这里,我们确确实实需要创建一个第三方来保存运算结果,否则我们的函数毫无意义

重载+运算符这个例子,跟我们常规编写函数的思想非常一致,都是根据参数,获得一个返回值,然后可以调用这个返回值。而对于ostream类型的对象,我们再来分析一下:

  1. 重载<<运算符:
ostream& operator<<(ostream& os,const data_& d){
    return os<<"("<<d.hour<<","<<d.temperature<<")";
} 

该函数,是将参数os在函数体中修改以后,再将其返回,实际上,可以这样理解:

未重载"<<"时输出data_对象数据需要:

os<<d.hour<<d.temperature;

此时,<<调用的是C++库中的函数,它完成数据的装入以及显示功能。

而重载"<<"后:

os可以直接用<<对data_类型的变量进行输出,即:

os<<d

而实际上,它会调用我们编写的重载函数,然后是在函数体中实现:

os<<d.hour<<d.temperature

而不用再显式地编写对应每个成员的输出语句。

在这个地方之所以产生疑问是因为:

传统的函数返回值,通常会被另一个第三方接收,而在这里,我们并没有发现任何一个第三方,所以就会产生返回值不知去向的感觉。实际上,将os返回以后,并没有任何第三方接收数据,也不需要接收数据,我们只需要在函数体中隐式地进行由基本<<实现的功能的堆叠,然后完成每个成员值的输出即可。这种堆叠就会导致我们认为<<产生了新的功能。实际上这种新的功能,还是由多个基本<<语句结合起来实现的。

由上可得,我们的

ostream& operator<<(ostream& os,const data_& d){
    return os<<"("<<d.hour<<","<<d.temperature<<")";
} 

可以改写为:

void operator<<(ostream& os,const data_& d){
    os<<"("<<d.hour<<","<<d.temperature<<")";
} 
验证:

函数实现:

ostream& operator<<(ostream& os,const data_& d){
    return os<<"("<<d.hour<<","<<d.temperature<<")";
} 

输出:

data_ d;
	d.hour = 12;
	d.temperature = 33.9;
	cout << d;

结果:

(12,33.9)

函数实现:

void operator<<(ostream& os,const data_& d){
    os<<"("<<d.hour<<","<<d.temperature<<")";
} 

输出:

data_ d;
	d.hour = 12;
	d.temperature = 33.9;
	cout << d;

结果:

(12,33.9)




(文章作学习笔记使用,本人水平有限,若有纰漏,欢迎指正)

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-04 22:37:15  更:2022-07-04 22:37:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:47:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码