关于重载运算符
关于C++中的重载运算符
学习博客1
学习博客2
记得好久之前学\(Dijkstra\)的堆优化的时候\(gxb\)神仙给我讲过,当时就是不明白感觉\(gxb\)都要崩溃了的亚子,好歹算是知道了,但是随着时间的流逝,他竟然趁我不注意从我脑子里跑了!\(gxb\)正拿着刀在赶来的路上
我们可以重定义或重载\(C++\)内的大部分内置运算符。
可以重载的运算符:
|+ | - |*| /| %|^|&|| |~|
|:-: |:-😐:-😐:-😐:-:
|! | = | < | > |+=|-=| = |/=|%|
|^= | &=| |= |<<|>>|>>=|<<=|==|!=|
|<= | >=| && | || |++|--|_>|‘|_>|
|[] | ()| new | delete |new[]|delete[]|
不能重载的运算符
. | :: | .* | ?: | sizeof |
---|
\(\color{red}{重载的运算符是带有特殊名称的函数,函数名是由关键字operator和其后要重载的运算符符号构成的。
}\)
与其他函数一样,重载运算符有一个返回类型和参数列表
Node operator<(const Node &n);
声明把小于号这个运算符用于把两个\(Node\)对象比较大小,返回最终的\(Node\)对象。
知识储备(主要是概念):
成员函数:假设我们定义一个结构体\(student\),这个结构体里有\(age,score\)等,而这个\(age,score\)就是成员函数(个人理解,如果有误欢迎指正)
大多数的重载运算符可以被定义为普通的非成员函数(就是我们平时写的各种函数)或者被定义为类成员函数。
如果我们定义上面的函数为类的非成员函数,很明显的,由于要比较所以我们需要穿两个参数给他。
Node operator<(const Node a,const Node b)
相应的如果我们要把他定义为一个成员函数(这里贴一下\(Dijkstra\)的结构体里的重载运算符)
因为priority_queue
写法一:
struct Node {
int u, v;
friend bool operator<(const Node a, const Node b){
return a.u > b.u;
}
};
\(friend\)是友元函数,什么是友元函数我也不知道反正\(lfd\) 跟我说不用学,还说这个东西可以用来装\(b\),但是如果用不好会\(CE\)很长时间。
写法二:
struct Node {
int u, v;
bool operator<(const Node &b) const {
return u > b.u;
}
};
谢谢收看,祝身体健康!