1.什么是运算符重载

运算符重载是一种函数重载。

运算符函数的格式:
operatorop(argument-list)
例如,operator+()重载+运算符。
其中的op,必须是有效的C++运算符,如operator@()会报错,因为C++中没有@运算符。

2.重载运算符的使用

如下例所示:

class Test
{
public:
Test operator+(Test &test);
}

调用运算符函数的方式有两种:
Test t1;
Test t2;
1)普通函数调用
Test t3 = t1.operator+(t2);
2)运算符方式调用,实质上是调用的1)中的operator+()函数
Test t3 = t1+t2;

3.运算符重载示例
示例代码如下,+运算符重载,计算时分相加。

mytest.h

#pragma once
class Time
{
private:
int hours;
int minutes;
public:
Time();
Time(int h,int m=);
Time operator+(const Time&t) const;
void Show() const;
};

mytest.cpp

#include "mytest.h"
#include<iostream>
Time::Time()
{
hours=minutes=;
}
Time::Time(int h,int m)
{
hours = h;
minutes = m;
}
Time Time::operator+(const Time &t) const
{
Time sum;
sum.minutes = minutes+t.minutes;
sum.hours = hours+t.hours+sum.minutes/;
sum.minutes%=;
return sum;
}
void Time::Show() const
{
std::cout<<hours<<" hours, "<<minutes<<" minutes"<<std::endl;
}

test.cpp

#include "mytest.h"
#include <iostream>
int main()
{
Time planning;
Time coding(,);
Time fixing(,);
Time total; total = coding+fixing; std::cout<<"coding+fixing = ";
total.Show(); total = coding.operator+(fixing);
std::cout<<"coding.operator+(fixing) = ";
total.Show(); total = coding+fixing+coding;
std::cout<<"coding.operator+(fixing) = ";
total.Show(); return ;
}

输出结果:

4.运算符重载的注意事项:
1)重载的运算符必须是有效的C++运算符
2)运算符操作数至少有一个是用户定义类型
这是为了防止重载标准类型的运算符
如将减法运算符(-)重载为计算两个double的和,而不是差,是不被允许的。
3)不能违反运算符原有的规则
如求模运算符(%),必须要有两个操作数。
4)部分运算符不允许重载
如:sizeof,::,:等

参考资料:《C++ Primer.Plus》 pp.381-390

C++运算符重载详解的更多相关文章

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

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

  2. C/C++对bool operator < (const p &a)const的认识,运算符重载详解(杂谈)

    下面来进行这段代码的分析: struct node {  //定义一个结构体node(节点)    int x;    int y;    int len;   //node中有3个成员变量x,y,l ...

  3. CPP-基础:运算符重载详解

    1.运算符重载定义: C++中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作.这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功 ...

  4. C++11运算符重载详解与向量类重载实例(<<,>>,+,-,*等)

    1. C++运算符重载介绍 C ++ 中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作.这时就必须在C ++ 中重新定义这些运算符,赋予已 ...

  5. C++重载>>和<<(输入和输出运算符)详解

    转载:http://c.biancheng.net/view/2311.html 在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据 ...

  6. Kotlin——最详细的操作符与操作符重载详解(上)

    本篇文章为大家详细的介绍Koltin特有的操作符重载.或许对于有编程经验的朋友来说,操作符这个词绝对不陌生,就算没有任何编辑基础的朋友,数学中的算数运算符也绝不陌生.例如(+.-.*./.>.& ...

  7. [java基础] 002 - 位运算符的详解和妙用

    一:位运算符详解 位运算符主要用来对操作数二进制的位进行运算.按位运算表示按每个二进制位(bit)进行计算,其操作数和运算结果都是整型值. Java 语言中的位运算符分为位逻辑运算符和位移运算符两类, ...

  8. ...:ES6中扩展运算符(spread)和剩余运算符(rest)详解

    1.扩展运算符(spread) demo1:传递数据代替多个字符串的形式 let test= function(a,b,c){ console.log(a); console.log(b); cons ...

  9. C++函数重载详解

    我们在开瓶瓶罐罐的时候,经常会遭遇因各种瓶口规格不同而找不到合适的工具的尴尬.所以有时候就为了开个瓶,家里要备多种规格的开瓶器.同样是开个瓶子嘛,何必这么麻烦?于是有人发明了多功能开瓶器,不管啤酒瓶汽 ...

随机推荐

  1. ERP仓库管理系统(九)

    需求分析: 1.设计库房表,至少包括两个字段,库房名称,库房所属公司的ID(在客户资质审批表中找到对应公司的ID) 2.设计增.删.改.查一套程序,其中的删除要做限制,只要有库存数据存在则不允许删除对 ...

  2. Postfix之mail.cf

    1.# 2. 3.vi /etc/postfix/main.cf #vi编辑postfix配置文件 4.#找到如下配置项酌情修改 5.###### 6.myhostname =  mail.yourd ...

  3. 20145210 《Java程序设计》第07周学习总结

    教材学习内容总结 第十二章 Lambda 12.1 认识Lambda语法 •Lambda 教材的引入循序渐近.深入浅出 •如果使用JDK8的话,可以使用Lambda特性去除重复的信息,例: Compa ...

  4. bat批处理文件命令详解

    bat批处理文件命令详解 echo.@.call.pause.rem(小技巧:用::代替rem)是批处理文件最常用的几个命令 echo 表示显示此命令后的字符  echo off 表示在此语句后所有运 ...

  5. [转]在Windows中配置Rsync同步

    在Windows中配置Rsync同步 Rsync是一款不错的文件免费同步软件,可以镜像保存整个目录树和文件系统,同 时保持原来文件的权限.时间.软硬链接.第一次同步时 rsync 会复制全部内容,下次 ...

  6. EditText 控件

    <EditText android:layout_width="fill_parent" android:layout_height="wrap_content&q ...

  7. 华为"128为大整数相加"机试题

    最近正直春招,偶尔接触到了华为的这道大整数相加的测试题,在网上找了一个算法,然后自己尝试进行了优化,最后也对memmove()函数效率有了进一步把握. #include <time.h># ...

  8. OpenFlow Switch学习笔记(六)——Instructions和Actions

    本文主要重点讨论OpenFlow Switch规范的指令集,它们深刻影响着数据包在Switch中的处理行为,下面开始从以下几个部分谈起. 1.Instructions 每一个Flow Entry里都包 ...

  9. debug进入线程中

    今天debug调试程序时,怎么也进入不了线程中,f5直接进源码,f6直接跳过了,后来把断点打在线程的Run()方法里面,按f8(可能要多按几次)就可以了.

  10. mapreduce入门之wordcount注释详解

    mapreduce版本:0.2.0之前 说明: 该注释为之前学习时找到的一篇,现在只是在入门以后对该注释做了一些修正以及添加. 由于版本问题,该代码并没有在集群环境中运行,只将其做为理解mapredu ...