热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【c++】重载操作符

目录输入和输出操作符算术操作符和关系操作符下标操作符自加、自减操作符成员访问操作符1输入和输出操作符1.1输出操作符1.1.1示例#include#inclu

目录

  1. 输入和输出操作符
  2. 算术操作符和关系操作符
  3. 下标操作符
  4. 自加、自减操作符
  5. 成员访问操作符

1  输入和输出操作符

1.1 输出操作符

1.1.1 示例

#include
#include
<string>
using namespace std;class A
{friend ostream
& operator<<(ostream& out, const A& a);public:A(const string &s &#61; "", int v &#61; 0) : ss(s), val(v) {} //构造函数带默认参数private:int val;string ss;
};ostream
& operator<<(ostream& out, const A& a)
{
out <<"a.ss:" <" " <<"a.val:" << a.val;return out;
}
int main()
{A a(
"hello", 23);cout < endl;A b;cout < endl;
}

结果

1.1.2 说明

1&#xff09;IO操作必须为非成员函数

原因&#xff1a;I/O操作的接口返回的是ostream&对象&#xff08;只有返回左值&#xff0c;这样才可以连续的输出&#xff0c;例如cout <

2&#xff09;因为要访问指定类的私有成员&#xff0c;所以在该类中声明输出操作符为友员函数。

3&#xff09;第一个形参必须为引用。因为I/O对象不可以复制。同理返回值必须为一个引用。

4&#xff09;第一个形参不可以为const&#xff0c;因为写入到流会改变其值。

5&#xff09;第二个为引用&#xff0c;这样可以避免复制。参数可以为const&#xff0c;可以接收const对象和非const对象&#xff1b;否则&#xff0c;如果为非const&#xff0c;则只能接收非coust对象。一般为const&#xff0c;毕竟只是输出而已&#xff0c;不改变对象。

 

1.2 输入操作符

1.2.1 示例

结果

1.2.2 说明

1&#xff09;输入与输出操作符的重要区别&#xff1a;输入操作符必须处理错误和文件结束的可能性。

2&#xff09;输入如果有多个值的话&#xff0c;如果一个数错了&#xff0c;整个输入对象就错了&#xff08;False&#xff09;&#xff0c;从示例中可以看出&#xff0c;前边赋值正确的已经生效了&#xff0c;后边的用了默认值&#xff0c;可以这样设计&#xff1a;如果输入错误&#xff0c;将整个对象复位&#xff0c;恢复到最初的状态&#xff0c;例&#xff1a;

 View Code

 

2 算术操作符和关系操作符

2.1 相等操作符

2.1.1 示例

#include
#include
<string>
using namespace std;class A
{friend
bool operator&#61;&#61;(const A& a, const A& b);friend bool operator!&#61;(const A& a, const A& b);public:A(string s &#61; "", int v &#61; 0) : ss(s), val(v) {}private:string ss;int val;
};
bool operator&#61;&#61;(const A& a, const A& b)
{
return a.ss &#61;&#61; b.ss && a.val &#61;&#61; b.val;
}
bool operator!&#61;(const A& a, const A& b)
{
return !(a &#61;&#61; b);
}
int main()
{A a(
"hello", 53);A b("hello", 54);A c("hello", 54);cout <<"a &#61;&#61; b?:" <<(a &#61;&#61; b) << endl;cout <<"a !&#61; b?:" <<(a !&#61; b) << endl;cout <<"b &#61;&#61; c?:" <<(b &#61;&#61; c) << endl;cout <<"b !&#61; c?:" <<(b !&#61; c) << endl;
}

结果

2.1.2说明

1&#xff09;定义了类的&#61;&#61;&#xff0c;对应的应该定义&#xff01;&#61;

 

2.2 关系操作符

2.2.1 示例

#include
#include
<string>
using namespace std;class A
{friend
bool operator<(const A& a, const A& b);public:A(string s &#61; "", int v &#61; 0) : ss(s), val(v) {}private:string ss;int val;
};
bool operator<(const A& a, const A& b)
{
return (a.val < b.val);
}
int main()
{A a(
"hello", 53);A b("he", 55);cout <<"a " <<(a endl;
}

结果

2.2.2 说明

1&#xff09;定义了相等操作符&#xff0c;一般也定义关系操作符

2&#xff09;关系操作符要根据具体的含义定义

 

2.3 赋值操作符

2.3.1 示例

#include
#include
<string>
using namespace std;class A
{friend ostream
& operator<<(ostream& out, const A& a);public:A(string s &#61; "", int v &#61; 0) : ss(s), val(v) {}A& operator&#61;(const A& a);private:string ss;int val;
};ostream
& operator<<(ostream &out, const A& a)
{
out <<"a.ss:" <" " <<"a.val:" << a.val;
}A
& A::operator&#61;(const A& a)
{
if(this !&#61; &a){ss &#61; a.ss;val &#61; a.val;}return *this;
}
int main()
{A a(
"hello", 53);A b("he", 55);cout < endl;b &#61; a;cout < endl;
}

2.3.2 说明

1&#xff09; 复制操作符完成对同类对象的赋值&#xff0c;参数一般为对类类型的const引用。

2&#xff09;如果没有&#xff0c;编译器会自动合成一个&#xff0c;类的赋值操作符一定为类的成员变量&#xff0c;以便编译器是否需要自己合成一个。

3&#xff09;返回值必须为*this的引用&#xff0c;这样就不需要创建和撤销结果的临时副本。同理的有复合赋值操作符&#xff0c;例如

 View Code

结果

 

2.4 加法操作符

2.4.1 示例

2.4.2 说明

1&#xff09; 根据复合操作符&#xff08;如&#43;&#61;&#xff09;实现算术操作符&#xff08;如&#43;&#xff09;&#xff0c;比其他方式更有效

 

3 下标操作符

3.1.1 示例

#include
#include
<string>
using namespace std;class A
{friend ostream
& operator<<(ostream& out, const A& a);public:A(string s &#61; "", int v &#61; 0) : ss(s), val(v) {}char& operator[](const size_t);const& char operator[](const size_t) const;private:string ss;int val;
};ostream
& operator<<(ostream& out, const A& a)
{
out <<"a.val:" <" " <<"a.ss:" << a.ss;return out;
}
char& A::operator[](const size_t index)
{
return ss[index];
}
const char& A::operator[](const size_t index) const
{
return ss[index];
}
int main()
{A a(
"hello", 53);cout <2] << endl;
}

结果

e

3.1.2 说明

1&#xff09; 下标操作必须为函数成员&#xff0c;因为传递一个参数&#xff0c;还需要另一个指向自己的指针参数&#xff0c;正好函数成员的this可以胜任。

2&#xff09; 类定义下标时&#xff0c;一般定义两个版本&#xff1a;一个为非const成员&#xff0c;并返回非const引用&#xff1b; 另一个为const成员&#xff0c;并返回const引用。这样应用与const对象时&#xff0c;返回值应为const引用&#xff0c;不能用作赋值的目标。

 

4 自加、自减操作符

4.1 前置自加、自减操作符

4.1.1 示例

结果

 

4.2 后置自加、自减操作符

4.2.1 示例

4.2.2 说明

1&#xff09;为了区分与前置自加、自减操作符的区别&#xff0c;后置需要接受一个而外的&#xff08;无用的&#xff09;的int型形参。使用后缀式操作符时&#xff0c;编译器提供0作为这个形参的实参&#xff0c;其唯一目的是为了区别前缀、后缀。

2&#xff09;a&#43;&#43;返回的是加之前的状态&#xff0c;因此&#xff0c;定义一个局部对象&#xff0c;保存&#xff08;*this&#xff09;&#xff0c;最后返回这个局部变量的备份&#xff08;注意不可以为引用&#xff0c;毕竟是局部的&#xff09;。

 

5. 成员访问操作符

5.1.1 示例

#include
#include
<string>
using namespace std;
class B
{
public:void print_B() { cout <<"hello !!" << endl; }
};
class U_Ptr
{friend
class HasPtr;B* ip;size_t use;U_Ptr(B *p) : ip(p), use(1) {}~U_Ptr() { delete ip; }
};
class HasPtr
{
public:HasPtr(B *p, int i) : ptr(new U_Ptr(p)), val(i) {}HasPtr(const HasPtr &orig) : ptr(orig.ptr), val(orig.val) { &#43;&#43;ptr->use; }HasPtr& operator&#61;(const HasPtr &orig);~HasPtr() { if(--ptr->use &#61;&#61; 0) delete ptr; }B& operator*() { return *ptr->ip; }B* operator->() { return ptr->ip; }private:U_Ptr *ptr;int val;
};HasPtr
& HasPtr::operator&#61;(const HasPtr &orig)
{
if(this !&#61; &orig){ptr &#61; orig.ptr;val &#61; orig.val;&#43;&#43;(ptr->use);}return *this;
}
int main()
{HasPtr hasptr1(
new B, 23);HasPtr hasptr2(hasptr1);*hasptr1;hasptr1->print_B();
}

结果

hello!!

5.1.2 说明

1&#xff09; 箭头必须定义为成员函数&#xff0c; 解引用不要求定义为成员&#xff0c;但是可以作为成员。

2&#xff09; 解引用和箭头操作常用在实现智能指针的类中。

 

 




本文转自jihite博客园博客&#xff0c;原文链接&#xff1a;http://www.cnblogs.com/kaituorensheng/p/3505115.html&#xff0c;如需转载请自行联系原作者



推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
author-avatar
zaizaiwaipo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有