C++运算符重载详解
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++运算符重载详解的更多相关文章
- c/c++面试题(6)运算符重载详解
1.操作符函数: 在特定条件下,编译器有能力把一个由操作数和操作符共同组成的表达式,解释为对 一个全局或成员函数的调用,该全局或成员函数被称为操作符函数.该全局或成员函数 被称为操作符函数.通过定义操 ...
- C/C++对bool operator < (const p &a)const的认识,运算符重载详解(杂谈)
下面来进行这段代码的分析: struct node { //定义一个结构体node(节点) int x; int y; int len; //node中有3个成员变量x,y,l ...
- CPP-基础:运算符重载详解
1.运算符重载定义: C++中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作.这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功 ...
- C++11运算符重载详解与向量类重载实例(<<,>>,+,-,*等)
1. C++运算符重载介绍 C ++ 中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作.这时就必须在C ++ 中重新定义这些运算符,赋予已 ...
- C++重载>>和<<(输入和输出运算符)详解
转载:http://c.biancheng.net/view/2311.html 在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据 ...
- Kotlin——最详细的操作符与操作符重载详解(上)
本篇文章为大家详细的介绍Koltin特有的操作符重载.或许对于有编程经验的朋友来说,操作符这个词绝对不陌生,就算没有任何编辑基础的朋友,数学中的算数运算符也绝不陌生.例如(+.-.*./.>.& ...
- [java基础] 002 - 位运算符的详解和妙用
一:位运算符详解 位运算符主要用来对操作数二进制的位进行运算.按位运算表示按每个二进制位(bit)进行计算,其操作数和运算结果都是整型值. Java 语言中的位运算符分为位逻辑运算符和位移运算符两类, ...
- ...:ES6中扩展运算符(spread)和剩余运算符(rest)详解
1.扩展运算符(spread) demo1:传递数据代替多个字符串的形式 let test= function(a,b,c){ console.log(a); console.log(b); cons ...
- C++函数重载详解
我们在开瓶瓶罐罐的时候,经常会遭遇因各种瓶口规格不同而找不到合适的工具的尴尬.所以有时候就为了开个瓶,家里要备多种规格的开瓶器.同样是开个瓶子嘛,何必这么麻烦?于是有人发明了多功能开瓶器,不管啤酒瓶汽 ...
随机推荐
- Ubuntu 14.10 下Server版本中文乱码问题
在安装Ubuntu server 14.10 时候选择了中文版,但是装好系统发现,里面的中文有乱码,解决办法 打开 /etc/default/locale sudo nano /etc/default ...
- MySQL创建数据表
* 创建数据表 * * * 一.什么是数据表 * * * * 二.创建数据表的SQL语句模型 * * DDL * * ...
- 浅谈对CSS的认识
自从进公司也有2个多月了,相信和我一批进来的小伙伴们都收获了很多东西,这个是在学校所学不到的,也让成长了很多.作为新人的我,从认为CSS是个很简单的东西,到现在觉得CSS中水很深,感觉学了很多的CSS ...
- 3、C#基础整理(语句概述)
语句 语句分为四个大类: * 分支语句:if,if... else,if ...else if... else,switch case * 循环语句:for,while,do while,foreac ...
- magento添加分类属性
在magento中给产品添加自定义属性是很容易实现在后台就可以很轻易添加,但是给分类就不行了,magento本身没有提供给category添加自定义属性.在实际的运用过程中我们想给cagegory添加 ...
- 转载: SQL Server中的索引
http://www.blogjava.net/wangdetian168/archive/2011/03/07/347192.html 1 SQL Server中的索引 索引是与表或视图关联的磁盘上 ...
- dede文章摘要字数的设置方法
本文转自:http://blog.csdn.net/yxwmzouzou/article/details/17491991 在织梦系统中(针对5.7版本),文章摘要(可以通过以下四种相关标签调用)被设 ...
- VS2012 编译 Assimp
VS2012 编译 Assimp 环境: assimp-3.1.1Windows 7 64BitVisual Studio 2012CMake 2.8.12.1 注意: 在Windows中编译assi ...
- codeforce The Art of Dealing with ATM
题目大意 ATM取款机有n种不同的钱币kind[i],每次取款允许吐出不超过k张钱币,且钱币的种类数不能超过2(一开始没理解2的意思),现在有q次取款,钱数为ques,问ATM能否凑出这样的钱,若能的 ...
- 关于 System.IO.FileAttributes 的 Reparse Points
关于Reparse Points找到下面的解释,要是能有更进一步的解释说明就更好了 Reparse Points其实是一个用户自定义的数据集合,它可以包含在一个文件或目录中.这种格式的数据能够被特定的 ...