运算符重载,主要是简化类类型运算,能够让我们对类对象直接用运算符进行运算。基本语法:

类型 operator 运算符(参数列表){ ... }
Complex operator+(Complex var1, Complex var2){ ... }

简单地说,就是给类对象定义自己的加减乘除等等操作符。同时,作为为了类对象的操作而重载的运算符,它是类的成员函数,或者含有至少一个类类型参数,例如:

(VS2013)

另外,重载运算符分两种①重载运算符是类的成员函数;②重载运算符不是类的成员函数,简单地说就是重载定义在类的内部还是外部,这两种情况是有很大区别的,例如,我自己定义的一个复数Complex类,并为其重载加法运算符:

class Complex
{
public:
int a, b;
void input(string s){
int v1 = ;
int i = ;
while (s[i] != '+'){
v1 = v1 * + s[i] - '';
i++;
}
while (s[i] == ' ' || s[i] == '+' || s[i] == 'i'){
i++;
}
int v2 = ;
while (i<s.length()){
v2 = v2 * + s[i] - '';
i++;
}
a = v1;
b = v2;
} /*========== 重载运算符为类成员函数 =============*/
Complex operator+(Complex var){ //参数列表里只有一个参数,this被绑定到左侧运算对象
//即第一个运算对象是this
int a1 = a; // a1 = this->a
int b1 = b;
int a2 = var.a;
int b2 = var.b;
Complex sumResult;
sumResult.a = a1 + a2;
sumResult.b = b1 + b2;
return sumResult;
}
/*===============================================*/
}; /*========== 重载运算符不是类成员函数 =============*/
Complex operator+(Complex var1, Complex var2){ //基本形式与函数定义相同
int a1 = var1.a;
int b1 = var1.b;
int a2 = var2.a;
int b2 = var2.b;
Complex sumResult;
sumResult.a = a1 + a2;
sumResult.b = b1 + b2;
return sumResult;
}
/*===============================================*/

那么,在重载运算符的时候,如何选择将其声明为非成员函数还是声明为类成员函数呢?

  • 赋值(=),下标([]),调用(()),成员访问(->)必须是成员函数;
  • 复合赋值运算符和形如递增、递减和解引用等改变对象状态或与类型密切相关的运算符,一般定义为成员函数(非必须);
  • 具有对称性运算符可能转换任一端运算对象,如算术(加减乘除etc)、相等性、关系和位运算符等,通常定义为非成员函数。

另外,如果参数含有类对象的混合表达式,必须定义成非成员函数。

(C++ primer P493)

运算符 note  
输出<<  一般第一个形参是非常量ostream对象的引用,不要打印换行符 必须是非成员函数
输入>>  第一个参数为读取流的引用,第二个参数是要读进去的非常量对象的引用,得检查读入是否成功 必须是非成员函数
算术+-*/  一般,形参为常量引用 可以是非成员函数
相等==  定义了==,应该也要有一个!= 可以是非成员函数
小于< 不是每个类都能定义一个< 可以是非成员函数
赋值=  要先销毁被赋值对象(左侧运算对象)当前的内存空间,再创建新空间存放新的赋值,返回被赋值对象的引用 必须是成员函数
复合赋值 +=、-=  返回左侧运算对象的引用 一般是成员函数
下标[]  返回所访问元素的引用(这样[]就可以出现在赋值运算符的任意一端);最好同时定义[]的常量版本和非常量版本 必须是成员函数

另外还有几个重载比较复杂的:

1、递增++/递减--运算符:

  • 要同时定义前置版本和后置版本;
  • 需要调用check函数检验对象是否有效;
  • 后置版本接受一个额外int类型形参(不被使用),需要在递增/递减对象之前记录之前的状态(后置递增返回值还是递增之前的值),后置版本要调用前置版本完成;
  • 显示调用:
    • 前置:p.operator++()【等价于++p】;
    • 后置:p.operator++(0)【等价于p++】

2、成员访问运算符*、->:

3、函数调用运算符():

【C++】运算符重载的更多相关文章

  1. C++ 运算符重载时,将运算符两边对象交换问题.

    在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...

  2. C#高级编程笔记2016年10月12日 运算符重载

    1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...

  3. C++运算符重载

    C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...

  4. 标准C++之运算符重载和虚表指针

    1 -> *运算符重载 //autoptr.cpp     #include<iostream> #include<string> using namespace std ...

  5. python运算符重载

    python运算符重载就是在解释器使用对象内置操作前,拦截该操作,使用自己写的重载方法. 重载方法:__init__为构造函数,__sub__为减法表达式 class Number: def __in ...

  6. PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天

    PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数    1  构造  2  析构   3  赋值  4 拷贝构造  5 oper ...

  7. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

    [源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...

  8. 我的c++学习(8)运算符重载和友元

    运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能.这个函数叫做运算符重载函数(常为类的成员函数). 方法与解释 ◆ 1.定义运 ...

  9. c/c++面试题(6)运算符重载详解

    1.操作符函数: 在特定条件下,编译器有能力把一个由操作数和操作符共同组成的表达式,解释为对 一个全局或成员函数的调用,该全局或成员函数被称为操作符函数.该全局或成员函数 被称为操作符函数.通过定义操 ...

  10. 实验12:Problem H: 整型数组运算符重载

    Home Web Board ProblemSet Standing Status Statistics   Problem H: 整型数组运算符重载 Problem H: 整型数组运算符重载 Tim ...

随机推荐

  1. BZOJ2851 : 极限满月

    把集合A[i]看作i点的前驱点集合,建成一个DAG,并新建超级源S,向每个前驱集合为空的点连边,那么B[i]就是S到i的必经点集合. 首先使用Lengauer-Tarjan算法建立出以S为起点的Dom ...

  2. java中特殊的String类型

    Java中String是一个特殊的包装类数据有两种创建形式: String s = "abc"; String s = new String("abc"); 第 ...

  3. [BZOJ 2631]tree

    裸LCT..QAQ写了三遍没写对 真是老了..QAQ 主要错的地方是 init: size[i] = sum[i] = val[i] = mul[i] = 1; pushdown: 注意判断左右儿子是 ...

  4. Lvs+keepalived+nginx+php的session 保持的算法

    ●什么是会话保持,有什么作用 会话保持是指在负载均衡器上有一种机制,在作负载均衡的同时,还保证同一用户相关连的访问请求会被分配到同一台服务器上. 会话保持有什么作用呢,举例说明一下 如果有一个用户访问 ...

  5. 多个mysql增加多个服务

    //mysql安装目录 mysqld --install mysqld --remove mysql5.5 mysqld --remove mysql5.5 C:\Program Files\MySQ ...

  6. 第五次实验报告 java 网络编程

    20145306 第五次 java 实验报告 实验内容 客户端与服务器连接,客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务器的公钥加密,计算明文的Hash函数值,一起传送给客 ...

  7. freeswitch

    FreeSWITCH 是一个电话的软交换解决方案,包括一个软电话和软交换机用以提供语音和聊天的产品驱动.FreeSWITCH 可以用作交换机引擎.PBX.多媒体网关以及多媒体服务器等.可以用作一个简单 ...

  8. eclipse常用窗口和功能总结

    1.左上角File按钮功能:最重要的导入import第三方项目,maven,git,general等. File->import File->properties按钮,显示项目的存储位置, ...

  9. empty()与remove([expr])的区别.转

    jquery之empty()与remove()区别   要用到移除指定元素的时候,发现empty()与remove([expr])都可以用来实现.可仔细观察效果的话就可以发现.empty()是只移除了 ...

  10. java 时间戳和PHP时间戳 的转换

    java 时间戳和PHP时间戳 的转换 PHPJava  总结一下java 时间戳和PHP时间戳 的转换问题: 由于精度不同,导致长度不一致,直接转换错误. JAVA时间戳长度是13位,如:12948 ...