c++运算符重载
C++允许在同一作用域中的某一函数和运算符指定多个定义,分别为函数重载和运算符重载。
一、运算符重载
运算符重载,就是赋予运算符新的含义。和函数重载一样,一个函数名可以用来代表不同功能的函数。
实质:调用函数的过程。
1.1为什么要进行运算符重载?
因为自定义类型不能直接采取运算符操作
运算符重载是为了解决类对象之间的运算的,通常的运算符只用于算术运算,如常量int之间,因为编译器已经定义了;而一个类两个对象之间成员进行运算必须重新定义,让编译器在遇到对象运算时能按我们要求的进行运算,这就是运算符重载的意义
作用:赋予运算符具有操作自定义类型数据的功能。
1.2运算符的限制
可以重载的运算符
算术运算符: + - * / %
自增、自减运算符: ++ --
位运算符: | & ~ ^ << >>
逻辑运算符: || && !
关系运算符: == != < > <= >=
赋值运算符: = += -= /= %= &= |= ^= <<= >>=
单目运算符: + - * &
动态内存分配: new delete new[] delete[]
其他运算符: () -> , [] (不能重载为友元函数)
不可以重载的运算符
. 成员访问运算符
:: 域运算符
.* ->* 成员指针访问运算符
szieof 长度运算符
?: 条件运算符
注:一个运算符被重载后﹐原有意义没有失去﹐只是定义了相对一特定类的一个新运算符
运算符重载语法:
1.3运算符重载分类
1、重载为成员函数,解释为:
Object.operator op(ObjectR)
左操作数由对象ObjectL通过this指针隐含传递,有操作数由参数Object传递
2、重载为友元函数,解释为:
operator op(ObjectL,ObjectR)
左右操作数由参数提供
二、运算符重载实现
注:运算符重载就是函数的调用,看不懂就用调用函数的方式来看。
2.1 、 以+运算符重载为例
用 全局函数 和 operator重载对比
#include<iostream>
#include <string>
using namespace std;
class A
{
public:
A(int id = 0, string name = " ") :id(id), name(name) {
}
friend A add(A& a, A& b);
friend A operator+(A& a, A& b);
void show()
{
cout << id << " " << name << endl;
}
private:
int id;
string name;
};
//函数方式实现A类型相+ 要访问类的私有成员要打破类的权限,使用要用friend
A add(A& a, A& b)
{
A x(a.id + b.id, a.name + b.name);
return x;
}
//用operator
A operator+(A& a, A& b)
{
A x(a.id + b.id, a.name + b.name);
return x;
}
int main()
{
A a(1, "嘻嘻嘻");
A b(2, "哈哈");
//全局函数
A c = add(a, b);
c.show();
//用operator 函数2种调用方式
//1、函数调用
A d = operator+(a, b);
d.show();
//2、直接正常用
A f