栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++运算符重载

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++运算符重载

C++运算符重载

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

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

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

a + b

我们可以看作:

operator+ (a,b);

再比如:

cout<<"Hello world";

我们可以看作:

operator<<(cout,"Hello world");


疑问:运算符重载,我们把运算符看作一个函数名,并且这个函数还有返回值,那么最后这个返回值给谁了?
比如我们跟上面一样重载了<<运算符,但是<<两边的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<<"("< 

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

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

os< 

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

而重载"<<"后:

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

os< 

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

os< 

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

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

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

由上可得,我们的

ostream& operator<<(ostream& os,const data_& d){
    return os<<"("< 

可以改写为:

void operator<<(ostream& os,const data_& d){
    os<<"("< 
验证:
 

函数实现:

ostream& operator<<(ostream& os,const data_& d){
    return os<<"("< 

输出:

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

结果:

(12,33.9)

函数实现:

void operator<<(ostream& os,const data_& d){
    os<<"("< 

输出:

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

结果:

(12,33.9)




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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1000808.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号