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.返回对象本身.返回对象引用都是可以的,并不是说一定要返回一个引用,只不过在不同的情况下需要不同的返回值. 那么什么情况下要返回对象的引用呢? 原因有两个: 允许进 ...
随机推荐
- faster-rcnn系列笔记(一)
目录: 1. 序言 2.正文 2.1 关于ROI 2.2 关于RPN 2.3 关于anchor 3. 关于数据集合制作 4. 关于参数设置 5. 参考 1.序言 叽歪一下目标检测这个模型吧,这篇笔 ...
- CF 348DTurtles
题目:http://codeforces.com/contest/348/problem/D 如果只走一条路那就直接dp就可以了. 设cal(x1,y1,x2,y2)为(x1,y1)→(x2,y2)的 ...
- codeforces Gym 101063 C
二进制转十进制 然后按位比较 传送门 http://codeforces.com/gym/101063 #include <cstdio> #include <cmath> # ...
- HDU--2024
C语言合法标识符 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- Element类型知识大全
Element类型 除了Document类型之外,Element类型就要算是Web编程中最常用的类型了.Element类型用于表现XML或HTML元素,提供了对元素标签名.子节点及特性的访问. 要 ...
- 基于逆波兰式的JAVA计算器
请看下方↓↓
- reduceByKeyLocally
2017年3月15日, 星期三 reduceByKeyLocally--Transformation类算子 代码示例
- java 静态导入 小结
之前看过静态导入这一块,在编程思想里,但是记不清了,今天搜了下,看到有一个博文写的不错,所以留做备注吧 总结: import static xxx.xxx 和普通导入的区别在于,普通导入是需要通过& ...
- WdatePicker时间插件
next_door_boy CnBlogs Home New Post Contact Admin Rss Posts - 14 Articles - 5 Comments - 0 WdateP ...
- oc 快排算法
直接复制粘贴就可以用了 - (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *M_arr = [[NSMutableArray allo ...