C++重载运算符简单总结
当运算符作用于类类型的运算对象时,可以通过运算符重载重新定义该运算符的含义。明智的使用运算符重载能令我们的程序更易于编写和阅读。
一、基本概念
- 什么是运算符重载?
重载的运算符是具有特殊名字的函数:它们的名字由关键字 operator 和其后要定义的运算符共同组成。 - 重载运算符的方式有哪些?
一般可以通过类成员函数、友元函数或者是类外的普通函数重载运算符。
二、规则
- 不能重载的运算符有:. .* :: 和 sizeof
- 友元函数和成员函数的使用场合:
一般情况下,建议一元运算符元使用成员函数重载,二元运算符使用友元函数重载
a. 运算符的操作需要修改类对象的状态,则使用成员函数。比如需要做左值操作数的运算符(=, +=, -=)
b. 运算时,有数和对象的混合运算时,必须使用友元函数
c. 二元运算符中,第一个操作数位非对象时,必须使用友元函数。如 << 和 >>
具体规则见下表:
| 运算符 | 建议使用 |
| 所有一元运算符 | 成员函数 |
| = () [] -> | 必须是成员函数 |
| += -= /= *= ^= &= != %= >>= <<= | 成员函数 |
| 所有其他的二元运算符 | 友元函数 |
| << >> | 必须友元函数 |
三、注意
- 一般情况下(除了函数调用操作符),重载运算符函数的参数数量与该运算符作用的运算对象数量一样多。一元运算符有一个参数,二元运算符有两个参数。对于二元运算符来说,左侧运算对象传递给第一个参数,右侧运算对象传递给第二个参数。
- 除了重载的函数调用运算符operator()之外,其他重载运算符不能含有默认实参。
- 当一个重载的运算符是成员函数时,this 绑定到左侧运算对象。所以成员运算符函数的(显式)参数数量比运算对象的数量少一个。
- 对于一个运算函数来说,它或者是类的成员,或者至少含有一个类类型的参数:
//错误:不能为int重定义内置的运算符
int operator+(int ,int);
C++重载运算符简单总结的更多相关文章
- C++ 重载运算符简单举例
我们可以重定义或重载大部分 C++ 内置的运算符.这样,就能使用自定义类型的运算符. 重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的.与其他函数一 ...
- 简单重载运算符in priority_queue By cellur925
我们都知道priority_queue是大根堆. 一.变成小根堆 法一:把元素的相反数丢进堆中 法二 priority_queue<int,vector<int>,greater&l ...
- 【STL】重载运算符
重载运算符 为什么要重载运算符: C++中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如结构体),也需要类似的运算操作.这时就必须在C++中重新定义这些运算符,赋予 ...
- C#基础知识系列一(goto、i++、三元运算符、ref和out、String和string、重载运算符)
前言 这两天在网上看到的总结很多,尤其是博客园中的,很多很多,也给了我很多的启发,当然自己也总结过,而且有很多人也给与我一些意见和看法.不管怎样,自己还是先把所谓的基础知识加强巩固下吧. 2014年的 ...
- C++学习之重载运算符1
C++除可重载函数之后,还允许定义已有的运算符,这样通过运算符重载可像处理数据使用它们. 先来个代码 #include<iostream> using namespace std; cla ...
- C++结构体:默认构造函数,复制构造函数,重载=运算符
C++结构体提供了比C结构体更多的功能,如默认构造函数,复制构造函数,运算符重载,这些功能使得结构体对象能够方便的传值. 比如,我定义一个简单的结构体,然后将其作为vector元素类型,要使用的话,就 ...
- C++ Primer 学习笔记_63_重载运算符和转换 --转换和类类型【上】
重载运算符和转换 --转换与类类型[上] 引言: 在前面我们提到过:能够用一个实參调用的位 unsignedchar 相同范围的值,即:0到255. 这个类能够捕获下溢和上溢错误,因此使用起来比内置u ...
- Python 正确重载运算符
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Helvetica } 有些事情让我不安,比如运算符重载.我决定不支持运算符重载,这完全是个人 ...
- 【noi 2.6_9290】&【poj 2680】Computer Transformation(DP+高精度+重载运算符)
题意:给一个初始值1,每步操作将1替换为01,将0替换为10.问N步操作后有多少对连续的0. 解法:f[i]表示第i步后的答案.可以直接打表发现规律--奇数步后,f[i]=f[i-1]*2-1;偶数步 ...
随机推荐
- [ SCOI 2009 ] 最长距离
\(\\\) \(Description\) 一个\(N\times M\)的网格图中有一些坏点,图是四联通的. 你至多可以拿走\(K\)个坏点,求拿走后联通的点对中欧几里得距离最大是多少. \(N, ...
- Android 在fragment中实现返回键单击提醒 双击退出
尝试用mvp架构加dagger2来重写了一下,大致功能都实现了,还没有全部完成. 项目地址 接近完成的时候,想在天气信息页面实现一个很常见的功能,也就是点击屏幕下方的返回键的时候不是返回到上一个act ...
- C#入门经典 Chapter3 变量和表达式
3.1 C#基本语法 分号结束语句 花括号字符不需要附带分号 缩进 注释:/*....*/,//,/// 区分大小写 3.2 C#控制台应用程序的基本结构 namespace Chapter3 ...
- C#——设置开机启动
将exe应用程序设置为开机启动,有多种方法,我们主要通过注册表设置开机启动选项. using Microsoft.Win32; using System.Windows.Forms; static v ...
- mounted钩子问题
recommend.vue <script type="text/ecmascript-6"> import Slider from 'base/slider/slid ...
- Scroll / Jump to id without jQuery
<scripttype="text/javascript"> function scroll(element){var ele = document.getElemen ...
- Python之进程 基础知识 上
阅读目录 理论知识 操作系统背景知识 什么是进程 进程调度 进程的并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 在python程序中的进程操作 multiprocess模块 进程的创建和mu ...
- demo_static_resrouce
环境 win10 + webstorm 2019.1.3 + node 12.x + yarn 实现的的功能 基本的js打包(支持规范:ES6 module | requirejs | commonj ...
- 3.Linux的远程管理及网络下载
3.1 Linux的远程管理 3.1.1 远程管理概述 什么是远程管理: 1.为什么需要远程管理: 服务器通常是Linux系统,而服务器不可能一直在身边,所以就需要远程来操作服务器 企业中通常需要集群 ...
- css 字体单位之间的区分以及字体响应式实现
问题场景: 在实现响应式布局的过程中,如何设置字体大小在不同的视窗尺寸以及不同的移动设备的可读性? 需要了解的有: 1.px,em,pt之间的换算关系 1em = 16px 1px = 1/16 e ...