operator重载运算符
1.重载运算符的函数一般格式如下
函数类型 operator 运算符名称 (形参表列)
{对运算符的重载处理}
例如,想将“+”用于Complex(复数)的加法运算,函数的原型可以是这样的:
operator+函数表示对运算符+重载。
其中,operator是关键字,专门用于定义重载运算符的函数的,运算符名称就是C++提供给用户的预定运算符。
注意:函数名是由operator和运算符组成。
2.两个形参是Complex类对象的引用,要求实参为Complex类对象。
- 在执行Point类型相加的表达式a+b时,系统就会自动调用operator+函数,把a+b作为实参,与形参进行虚实结合。
- 下面的a+b语句中,相当于a调用函数+,把b作为该函数的一个参数传递给该函数,从而实现了两个Point类型的相加。
- 为了说明把运算符重载后,执行表达式就是调用函数的过程,可以把两个整数相加也想象称为调用下面的函数:
#include <iostream>
using namespace std; struct Point {
int x, y;
Point(int x = 0, int y=0):x(x),y(y){}
}; Point operator + (const Point& A, const Point& B) {
return Point(A.x+B.x, A.y+B.y);
} ostream& operator << (ostream &out, const Point&p) {
out << "(" << p.x << "," << p.y << ")";
return out;
} int main() {
Point a, b(1, 2);
a.x = 3;
cout << a + b <<"\n";
system("pause");
return 0;
}
对于全局重载操作符,代表左操作数的参数必须被显式指定。
****
运算符重载函数operator +还可以改写的更简练一些:
{
return Complex(c2.real+real,c2.imag+imag);
}
return语句中的Complex(c2.real+real,c2.imag+imag)是建立一个临时对象,它没有对象名,是一个无名对象。
在建立临时对象过程中,调用构造函数。return语句将此临时对象作为函数返回值。
那么,我们将+运算符进行了重载以后,可否将一个常量和一个复数相加呢?比如:
实参和形参匹配才可以调用函数。
应写成对象形式,如:
还需要说明的是:运算符被重载后,其原有的功能仍然保留,没有丧失或改变。
例如,运算符+被重载以后,仍然可以用于int,float,double,char类型数据的运算,同时又增加了用于定义时数据类型的相加的功能。
编译系统根据表达式的上下文,即根据运算符两侧(如果是单目运算符则为一侧)的数据类型决定的。
如,对于3+5,则执行整数加法;对于3.4+5.45,则执行双精度数加法;对于两个复数类相加,则执行复数加法。
3.如何决定把一个操作符重载为类成员函数还是全局名字空间的成员呢?
operator重载运算符的更多相关文章
- C++ operator重载运算符和隐式转换功能的实现
C++ operator重载运算符和隐式转换功能的实现: #include <iostream> using namespace std; class OperatorTest { pub ...
- C++解析七-重载运算符和重载函数
重载运算符和重载函数C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载.重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列 ...
- 关于对STL容器重载运算符的问题
注意:下文中vector数组指的是每个数组元素都是一个vector的数组 大部分有序STL容器都重载了小于号,且比较方式是对容器中元素进行字典序比较. 此时如果你写\(bool\ operator&l ...
- [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)
operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...
- 重载运算符-operator
先看段代码: struct node { friend bool operator< (node n1, node n2){ // 优先取最小的,它与下面的 // 是等价的 return n1. ...
- c++的重载运算符
c++中允许重载运算符: 这是我辛苦的结果 #include"iostream"using namespace std;class aaa{ int x;public: aaa() ...
- C# 重载运算符
如果你想让自己定义的类型可以用运算符进行运算,那么可以通过重载运算符来实现: 示例: class Salary { public int RMB { get; set; } public static ...
- 【STL】重载运算符
重载运算符 为什么要重载运算符: C++中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如结构体),也需要类似的运算操作.这时就必须在C++中重新定义这些运算符,赋予 ...
- c++中有些重载运算符为什么要返回引用
事实上,我们的重载运算符返回void.返回对象本身.返回对象引用都是可以的,并不是说一定要返回一个引用,只不过在不同的情况下需要不同的返回值. 那么什么情况下要返回对象的引用呢? 原因有两个: 允许进 ...
随机推荐
- 七牛php-sdk使用-在线打包
如果需要将空间中的多个文件,打包成一个压缩文件,该怎么做,不需要自己本地打包好再上传,七牛已经为我们提供了这项服务. 命令:mkzip/2/url/xx/alias/xxx; 不仅可以将文件打包,还可 ...
- 爬虫、请求库requests
阅读目录 一 介绍 二 基于GET请求 三 基于POST请求 四 响应Response 五 高级用法 一 介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,req ...
- Python_day1
一.HelloWorld >>>print("Hello World!") >>>Hello World! 二.变量 1.什么是变量 : ...
- Gym 101667I Slot Machines
原题传送门 题意:给定n(n≤106)个数,要求将它化为混偱环小数的形式,即前k个数不参与循环,之后所有数以p为循环节长度进行循环.求k和p,要求k+p尽量小,k+p相等时要求p尽量小. 样例1 输入 ...
- BZOJ 1001: [BeiJing2006]狼抓兔子【最大流/SPFA+最小割,多解】
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 23822 Solved: 6012[Submit][ ...
- DataURL与File,Blob,canvas对象之间的互相转换的Javascript
canvas转换为dataURL (从canvas获取dataURL) var dataurl = canvas.toDataURL('image/png'); var dataurl2 = canv ...
- cookie 和 session的区别
一.总结: 1.cookie数据存放在客户的浏览器上,session数据放在服务器上. 2.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用ses ...
- HtmlHelper总结
HTML helper是在视图页面上操作HTML元素时可以调用的方法,还包括URL helper和AJAX helper.这些帮助方法都为了使得操作HTML更加容易.分为两类:a.编辑和输入帮助类b. ...
- php(ThinkPHP)实现微信小程序的登录过程
源码也在我的github中给出 https://github.com/wulongtao/think-wxminihelper 下面结合thinkPHP框架来实现以下微信小程序的登录流程,这些流程是结 ...
- nginx版本如何选择?
生产环境使用Stable version:最新稳定版,现在最新的版本是nginx-1.8.1 注意各版本的区别:Nginx官网提供了三个类型的版本 1.Mainline version:Mainlin ...