【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——(9.13.1-9.13.4)
??????????????????????创做不易,麻烦点个关注????????????????????????
??????????????????文末有惊喜!献舞一支!????????????????????
目录
9.13 运算符重载
????????C++ 中的运算符重载允许用户对已存在的运算符进行重新定义,赋予其另一种功能,以适应自定义类型的操作。运算符重载通过特殊的函数名称和语法来实现,在函数中定义了对应运算符的操作。
9.13.1 运算符重载的基本概念
????????语法:定义重载的运算符就像定义函数,只是该函数的名字是operator@,这里的@代表了被重载的运算符。
思路:
1、弄懂运算符的运算对象的个数。 (个数决定了重载函数的参数个数)
2、识别运算符左边的运算对象 是类的对象还是其他类的对象:全局函数实现 (不推荐)成员函数实现(推荐,少一个参数)其他:只能是全局函数实现
9.13.2 重载<<输出运算符(全局函数实现)
问题:为什么要使用运算符重载?
?为了满足上面这个问题,就需要我们使用重载运算符。
后面这个不使用传引用来接这个对象。可以不加引用?
?
??
特别的:别忘了引用头文件
结果:
上面的? “? ?cout << Jery; ” 可以替换成? ?“? operator << (cout,Jery);?”?被编译器优化成前面那个写法了。
并且,如果后面新增了“endl”此时也是不对的
?怎么处理呢?
这时候下面这样的写法都可以通过?
?代码1:
#include <iostream>
#include <string>
#include "array.h"
using namespace std;
class Person
{
friend void operator<<(ostream &out,Person &ob);
private:
int num;
string name;
float score;
public:
Person(){}
Person(int num,string name,float score):num(num),name(name),score(score){}
};
//全局函数重载operator<<
void operator<<(ostream &out,Person &ob){
out<<ob.num<<" "<<ob.name<<" "<<ob.score<<endl;
}
int main()
{
Person Jery(100,"Jery",99.9f);
cout<<Jery;
return 0;
}
修改增加endl的代码:
class Person
{
friend ostream& operator<<(ostream &out,Person &ob);
private:
int num;
string name;
float score;
public:
Person(){}
Person(int num,string name,float score):num(num),name(name),score(score){}
};
//全局函数重载operator<<
ostream& operator<<(ostream &out,Person &ob){
out<<ob.num<<" "<<ob.name<<" "<<ob.score<<endl;
return out;
}
int main()
{
Person Jery(100,"Jery",99.9f);
cout<<Jery<<endl;
Person Jery2(100,"Jery2",98.9f);
cout<<Jery2;
return 0;
}
?上述代码均已通过本人亲测可以使用,输出。基于C++11版本以及以上,使用了Qt5.13.2版本。
9.13.3 重载>>输入运算符(全局函数实现)
????????这里和9.12.2<<输入运算符基本一致,就是输入使用的是istream流
上述暂时不能实现链式操作(就是cin>>a>>b;两个对象就不行,此时考虑返回值,cin>>a完了以后,返回一个cin类型就行了)
?
?9.13.4 可以重载的运算符
????????C++ 中有三个逻辑运算符:非(!
)、与(&&
)和或(||
)。其中,非(!
)可以被重载,但其他运算符不行。这是因为,逻辑运算符?&&
?和?||
?进行短路求值(short-circuiting)的特性,导致它们的行为比较复杂,重载可能会造成语义上的混淆甚至是不确定性。
????????另一方面,逻辑运算符?&&
?和?||
?的操作数必须是布尔类型,因此在用于自定义类型时并没有实际的意义,从而也就没有了重载的必要。如果我们需要在自定义类型上执行类似逻辑运算的操作,可以考虑使用其他的运算符或者函数,例如重载比较运算符或者编写成员函数来完成类似的功能。
点赞👍 ?+ 收藏👐 + 关注👌
??您的支持??是我最大的动力??相互学习??共同进步??一起搞钱??动动发财的小手??
? ????????????????????十星好评,Erike的专用模板?????????????????????
什? 么 ?您? 要? 打? 赏 ?谢 ? ?谢 ? ?老? ?板!老 ? ?板 ? ?大 ?? 气!?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!