【C++】C++中的操作符重载
C++中的操作符重载使得对于类对象的操作更加方便和直观,但是对于各种操作符重载的规则以及语法形式,一直以来都是用到哪一个上stackoverflow上查找,在查找了四五次之后,觉得每次麻烦小总结一下。
操作符重载的一般语法
重载方式分为两种,一种是重载为类的成员函数,另一种重载为类的友元函数,其语法形式分别为:
// 方式一:重载为成员函数
class MyClass
{
public:
返回类型 operator 操作符(形参列表);
}; 返回类型 MyClass::operator 操作符(形参列表)
{
// 函数体
} // 方式二:重载为友元函数
class MyClass
{
public:
friend 返回类型 operator 操作符(形参列表);
}; 返回类型 operator 操作符(形参列表)
{
// 函数体
}
操作符重载的三条基本原则
- 如果操作符的含义并不显而易见或者有可能存在争议,不应该重载该操作符。考虑提供一个函数代替该操作符重载。
- 总是坚持操作符固有的语义。比如,如果将+操作符重载表示的语义a-b,编译器能够顺利通过,但是与操作符使用者的预期严重不符。
- 总是提供所有相关的操作符。比如,如果支持了a+b,使用者当然期望能够调用a+=b;如果支持前缀自增++a,同时提供后缀自增a--。如果提供了a<b,请提供a>b。
成员函数与非成员函数(友元函数)的选择
赋值操作符(=), 取下标操作符([]), 成员访问操作符(->)和函数调用操作符( () )必须重载为成员函数。
- 如果是一元操作符,实现为成员函数
- 如果是二元操作符,并且该二元操作符视左右操作数为平等的(例如:算数操作符,关系操作符和位操作符等),实现为非成员函数
- 如果是二元操作符,并且视左右操作数不平等,那么实现为成员函数(例如:+=,-=,*=, /=等)
常见的操作符重载
说了那么多,最重要的就是常见操作符的语法形式,如下:
#include <iostream>
#include <string>
using namespace std;
class ClassType; // 输入输出操作符(必须为非成员函数)
ostream& operator<< (ostream& os, const ClassType& object) {return os;}
istream& operator>> (istream& is, ClassType& object) {return is;} // 注意object对象是非const引用 //赋值操作符(必须为成员函数)
ClassType& operator= (const ClassType& object) {return *this;}
ClassType& operator-= (const ClassType& object) {return *this;}
ClassType& operator*= (const ClassType& object) {return *this;}
ClassType& operator/= (const ClassType& object) {return *this;}
ClassType& operator%= (const ClassType& object) {return *this;} // 算术操作符(一般定义为非成员函数)
ClassType operator+ (const ClassType& lhs, const ClassType& rhs);
ClassType operator- (const ClassType& lhs, const ClassType& rhs);
ClassType operator* (const ClassType& lhs, const ClassType& rhs);
ClassType operator/ (const ClassType& lhs, const ClassType& rhs);
ClassType operator% (const ClassType& lhs, const ClassType& rhs); // 关系操作符(一般定义为非成员函数)
inline bool operator< (const ClassType& lhs, const ClassType& rhs);
inline bool operator<= (const ClassType& lhs, const ClassType& rhs);
inline bool operator> (const ClassType& lhs, const ClassType& rhs);
inline bool operator>= (const ClassType& lhs, const ClassType& rhs);
inline bool operator== (const ClassType& lhs, const ClassType& rhs);
inline bool operator!= (const ClassType& lhs, const ClassType& rhs); // 自增和自减操作符(一般作为成员函数)
ClassType& operator++ () {return *this;} // 前缀++,例如:++iter
ClassType& operator-- () {return *this;}
ClassType operator++ (int) {return tmp;} // 后缀++,例如:iter++
ClassType operator-- (int) {return tmp;} // 下标操作符(必须定义为成员函数)
TypeInContainer& operator[] (const size_t index) // 非const版本
const TypeInContainer& operator[] (const size_t index) const // const 版本 // 成员访问操作符(*,-> 定义成员函数)
Class MyPtr
{
value_type& operator*(); //非const版本
const value_type& operator*() const; //const版本
value_type* operator->();
const value_type* operator->() const;
}; // 函数调用操作符
struct MyClass
{
ClassType operator()(Type1 x1, Type2 x2)
{ }
};
参考文献:
- Statckoverflow operator overloading discussion
- S.B.Lippman and J.Lajoie. C++ Primer中文版. 北京:人民邮电出版社, 2011. 430-453.
- 随感而发:C++操作符重载
【C++】C++中的操作符重载的更多相关文章
- C++中的操作符重载
一.什么是操作符重载 操作符重载可以分为两部分:“操作符”和“重载”.说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载 ...
- Python中的操作符重载
运算符重载是指在方法中拦截内置的操作----当类的实例出现在内置操作中,Python会自动调用自定义的办法,并且返回自定义方法的操作结果. 类可以重载python的操作符 操作符重载使我们的对 ...
- C++中逗号操作符重载的分析
1,关注逗号操作符重载后带来的变化: 2,逗号操作符: 1,逗号操作符(,)可以构成都好表达式:exp1, exp2, exp3, ..., expN 1,逗号表达式用于将多个表达式连接为一个表达式: ...
- C++中采用操作符重载完善复数类
1,复数类应该具有的操作: 1,运算:+,-,*,/: 2,比较:==,!=: 3,赋值:=: 4,求模:modulus: (5),完善的复数类操作符重载必不可少: 2,利用操作符重载: 1,统一复数 ...
- Groovy中的操作符重载
操作者 方法 a + b a.plus(b)中 a - b a.minus(b)中 a * b a.multiply(b)中 a ** b a.power(b)中 a / b a.div(b)中 a ...
- C++中操作符重载的概念
1,下面的复数解决方案是否可行? 1,代码示例: class Comples { public: int a; int b; }; int main() { Complex c1 = {, }; Co ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 操作符重载和隐式类型转换
C#中,某些类型会定义隐式类型转换和操作符重载.Unity中,有些对象也定义了隐式类型转换和操作符重载.典型情况有:UnityEngine.Object.UnityEngine.Object的销毁是调 ...
- C++解析(17):操作符重载
0.目录 1.操作符重载 2.完善的复数类 3.小结 1.操作符重载 下面的复数解决方案是否可行? 示例1--原有的解决方案: #include <stdio.h> class Compl ...
- C++学习笔记-操作符重载
操作符重载(operator overloading)是一种形式的C++多态,C++将操作符重载扩展到用户自定义的类型,如允许使用+将两个自定义的对象相加,编译器将根据操作数的数目和类型决定使用那种加 ...
随机推荐
- C# CS1591 缺少对公共可见类型或成员的 XML 注释 问题解决
最近在写web api的项目,用到微软的Web api help page组件,用于自动对生成API文档,见博文: https://www.cnblogs.com/lenmom/p/9081363.h ...
- git/github基本命令
Git与项目 git的使用,主要包括: 本地仓库的命令 远程仓库的命令 项目需求.页面.模型类的设计,及页面的使用 sudo apt-get install git 安装成功后,运行如下命令 git ...
- leetcode303
public class NumArray { List<int> list = new List<int>(); public NumArray(int[] nums) { ...
- open方法读写文件
vb使用open方法读写文件 (一)打开和关闭文件 1.顺序文件 打开顺序文件,我们可以使用Open语句.它的格式如下: Open pathname For [Input |Output |Appen ...
- tomcat没有发布maven项目依赖的本地jar包
建立springMVC的maven项目,平时使用的jar包都是在pom.xml文件配置依赖关系, maven会自动从仓库中下载,这样使用tomcat部署发布都没有问题.但有时我们需要使用maven仓库 ...
- 迷你MVVM框架 avalonjs 0.96发布
本版本主要是性能优化与 fix BUG,改进如下: 处理notifySubscribers中的BUG,它在标准浏览器不会移除那些无用的视图刷新函数.详见这里 重构modelBindling.SELEC ...
- js中改变文档的层次结构(创建元素节点,添加结点,插入子节点,取代子节点,删除子节点)
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 【独家】阿里天池IJCAI17大赛第四名方案全解析(附代码)
[独家]阿里天池IJCAI17大赛第四名方案全解析(附代码) https://mp.weixin.qq.com/s?__biz=MzAxMzA2MDYxMw==&mid=2651560625& ...
- ProjectLeader感悟
1 首先项目的目标清晰明确,开发的方案也必须清晰明确. 确保两点的做法,是面对面的访谈,很简单的可以打电话或者QQ或者邮件:方案要多次揣摩,设计出合理的方案.如果发以上两点做不好,你就会受到组员的鄙视 ...
- Python_07-常用函数
1 python常用常用函数 1.1 常用内置函数 1.2 类型转换函数 1.3 和操作系统相关的调用 1.3.1 操作举例 1.4 用os ...