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

C++中的运算符重载重载输出操作符、算术运算符、关系运算符、自加运算符、下标运算符

C中的运算符重载程序员可以重定义或重载大部分C内置的运算符。这样就能使用自定义类型的运算符。重载的运算符是带有特殊名称的函数,函数名是由关键字operator和其后

C++中的运算符重载

程序员可以重定义或重载大部分 C++ 内置的运算符。这样就能使用自定义类型的运算符。重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。
运算符重载规则如下:
①、 C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已有的运算符。
②、 重载之后运算符的优先级和结合性都不会改变,但是运算对象的求值顺序无法应用到重载的运算符上。
③、 运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。一般来说,重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。
不能重载的运算符只有五个,它们是:成员运算符“.”、指针运算符“*”、作用域运算符“::”、“sizeof”、条件运算符“?:”
下面以一个位置坐标position类作为一个例子介绍一些常见的运算符重载,其中position类包含三维坐标x,y,z。主要有输出操作符重载、算术运算符重载、关系运算符重载、自加运算符重载、下标运算符重载。代码中有详细的注解。

overloadtest.h

#pragma once
#include
#include
class Position
{
public:Position() &#61; default;//默认构造函数Position(double x, double y,double z) :x(x), y(y), z(z) {};Position(const Position&pos) &#61; default;~Position() &#61; default;//输出操作符重载&#xff0c;由于是类外的函数&#xff0c;访问类内私有变量则应该被定义为友元函数friend std::ostream& operator<< (std::ostream& out, const Position& pos);friend bool operator&#61;&#61; (const Position& lpos, const Position& rpos);//算术运算符重载&#xff0c;&#43;&#61;应该定义为类内的成员函数&#xff0c;&#43;应该定义为类外的函数Position& operator&#43;&#61; (const Position& rpos);//前置递增运算符重载Position& operator&#43;&#43; ();//后置递增运算符重载Position operator&#43;&#43; (int);//赋值运算符重载Position& operator&#61; (const Position& pos);//下标运算符重载double& operator[](std::size_t n);const double& operator[](std::size_t n) const;private:double x;double y;double z;
};
Position operator&#43; (const Position& lpos, const Position& rpos);
bool operator!&#61; (const Position& lpos, const Position& rpos);

overloadtest.cpp

#include "overloadtest.h"
//输出操作符重载&#xff0c;约定写在类外而不是成员函数
std::ostream& operator<< (std::ostream& out,const Position& pos)
{out << pos.x << " " << pos.y << " " << pos.z << " " << std::endl;return out;
}
//算术运算符重载&#xff0c;&#43;&#61;应该定义为类内的成员函数
Position& Position::operator&#43;&#61; (const Position& rpos)
{x &#43;&#61; rpos.x;y &#43;&#61; rpos.y;z &#43;&#61; rpos.z;return *this;
}//算术运算符重载&#xff0c;&#43;应该定义为类外函数
Position operator&#43; (const Position& lpos, const Position& rpos)
{Position sum &#61; lpos;sum &#43;&#61; rpos;return sum;
}//相等操作符重载&#xff0c;约定写在类外而不是成员函数
bool operator&#61;&#61; (const Position& lpos, const Position& rpos)
{return lpos.x &#61;&#61; rpos.x&&lpos.y &#61;&#61; rpos.y&&lpos.z &#61;&#61; rpos.z;
}
//不等操作符重载&#xff0c;依赖于相等运算符
bool operator!&#61; (const Position& lpos, const Position& rpos)
{return !(lpos &#61;&#61; rpos);
}//前置递增运算符重载
Position& Position::operator&#43;&#43; ()
{&#43;&#43;x;&#43;&#43;y;&#43;&#43;z;return *this;
}
//后置递增运算符重载
Position Position::operator&#43;&#43; (int)
{Position res;res &#61; *this;&#43;&#43;(*this);return res;
}
//赋值运算符重载
Position& Position::operator&#61; (const Position& pos)
{this->x &#61; pos.x;this->y &#61; pos.y;this->z &#61; pos.z;return *this;
}//下标运算符重载
double& Position::operator[](std::size_t n)
{if (n < 0 || n>2){std::cout << "越界" << std::endl;assert(n < 0 || n>2);}if (n &#61;&#61; 0)return x;if (n &#61;&#61; 1)return y;if (n &#61;&#61; 2)return z;
}
//下标运算符重载
const double& Position::operator[](std::size_t n) const
{if (n < 0 || n>2){std::cout << "越界" << std::endl;assert(n < 0 || n>2);}if (n &#61;&#61; 0)return x;if (n &#61;&#61; 1)return y;if (n &#61;&#61; 2)return z;
}

main.cpp

#include
#include "overloadtest.h"
using namespace std;
int main()
{Position pos(10, 5.0, 6.0);Position pos1(10, 5.0, 6.0);Position pos2(1.5, 12.3, -5.8);Position pos4(pos);cout << "pos1: " << pos1 << endl;//输出操作符重载cout << "pos2: " << pos2 << endl;cout << "pos4: " << pos4 << endl;pos2 &#43;&#61; pos1;//&#43;&#61;运算符重载cout << "pos2: " << pos2 << endl;Position pos3 &#61; pos1 &#43; pos1;//&#43;运算符重载cout << "pos3: " << pos3 << endl;if (pos &#61;&#61; pos1){cout << "pos 等于 pos1" << endl;}if (pos !&#61; pos2){cout << "pos 不等于 pos2" << endl;}cout << "&#43;&#43;pos: " << &#43;&#43;pos << endl;cout << "&#43;&#43;pos: " << pos << endl;cout << "pos&#43;&#43;: " << pos&#43;&#43; << endl;cout << "pos&#43;&#43;: " << pos << endl;Position pos5;pos5 &#61; pos;//赋值运算符重载cout << "pos5: " << pos5 << endl;//下标运算符重载pos5[0] &#61; 100;pos5[1] &#61; 10;pos5[2] &#61; 1;cout << "pos5: " << pos5 << endl;system("pause");return 0;
}

结果

在这里插入图片描述


推荐阅读
  • poj 3352 Road Construction ... [详细]
  • 本文介绍如何使用线段树解决洛谷 P1531 我讨厌它问题,重点在于单点更新和区间查询最大值。 ... [详细]
  • T15483.【清华集训2017模拟11.26】简单路径T25484.【清华集训2017模拟11.26】快乐树T35485.【清华集训2017模拟11.26】字符串T1结论题,结论很 ... [详细]
  • [c++基础]STL
    cppfig15_10.cppincludeincludeusingnamespacestd;templatevoidprintVector(constvector&integer ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 题目《BZOJ2654: Tree》的时间限制为30秒,内存限制为512MB。该问题通过结合二分查找和Kruskal算法,提供了一种高效的优化解决方案。具体而言,利用二分查找缩小解的范围,再通过Kruskal算法构建最小生成树,从而在复杂度上实现了显著的优化。此方法不仅提高了算法的效率,还确保了在大规模数据集上的稳定性能。 ... [详细]
  • 本报告对2018年湘潭大学程序设计竞赛在牛客网上的时间数据进行了详细分析。通过统计参赛者在各个时间段的活跃情况,揭示了比赛期间的编程频率和时间分布特点。此外,报告还探讨了选手在准备过程中面临的挑战,如保持编程手感、学习逆向工程和PWN技术,以及熟悉Linux环境等。这些发现为未来的竞赛组织和培训提供了 valuable 的参考。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
author-avatar
伊甸园的常青藤
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有