C++运算符重载
1. C++运算符分类
C++中的运算符种类很多,除了我们数学中学的各种关系运算符、算数运算符之外,C++也有其特有的运算符。
运算符类型 | C++中常见运算符 |
---|---|
赋值运算符 | 等于(=),加等(+=),减等(-=),乘等(*=),除等(/=) |
算数运算符 | 加(+),减( -),乘( *),除( /), 自增(++),自减(--),取余(%) |
关系运算符 | 等于(==),大于(>),小于(<),不等于(!=),大于等于(>=),小于等于(<=) |
逻辑运算符 | 逻辑与(&&),逻辑或(||),逻辑非(!) |
地址运算符 | (*),(->) |
运算符其实还有很多种,上面只列举了部分我们在编程中常用到的运算符。
2. 赋值运算符重载
赋值运算符在使用时,左侧为原有的参数,右侧为代入计算的参数,其使用模板为:
// 重载=
P& operator=(P& p1){
...; // 类成员之间的关系
return *this;
}
// 重载+=
P& operator+=(P& p1){
...; // 类成员之间的关系
return *this;
}
3.算数运算符
对于+ - * / 运算符可以直接采用下面格式进行重载。
// 重载+
P& operator+(P& p1){
...; // 类成员之间的关系
return *this;
}
// 重载/
P& operator/(P& p1){
...; // 类成员之间的关系
return *this;
}
对与自增(++)、自减(--)运算符,其分为前后自增、前后自减,因此要分开定义。
// 重载++ ++p 前自增
P& operator++(){
...; // 类成员之间的关系
return *this;
}
// 重载++ p++ 后自增
P& operator++(int){
P temp = *this;
...; // 类成员之间的关系
return temp;
}
4. 关系运算符重载
关系运算符返回值为布尔值,在重载时将返回值设为bool
类型
// 重载<
bool operator<(P& p1){
...; // 类成员之间的关系
return true/false;
}
// 重载==
bool operator==(P& p1){
...; // 类成员之间的关系
return true/false;
}
5. 逻辑运算符重载
// 重载<
bool operator&&(P& p1,P& p2){
...; // 类成员之间的关系
return true/false;
}
// 重载==
bool operator||(P& p1,P& p2)){
...; // 类成员之间的关系
return true/false;
}
C++从语法上支持逻辑操作符重载,但是逻辑操作符重载后无法完全实现原生的语义,不满足短路法则,因此在实际使用时尽量不要重载逻辑运算符。
6.地址运算符
地址运算符我们一般不会重载,一般会在使用迭代器时使用,如下面所示:
template<class T>
T& operator*() { return node->element; }
template<class T>
T* operator->() { return &node->element; }
7. 其他运算符
重载[]:
在设计数组列表操作时,我们往往都需要使用[]
符号,下面对其进行重载:
template<class T>
T& operator[](int index){
T& a;
...;
return a;
}
重载<<
我们如果想使用cout<<
输出我们的类成员,我们就需要重载<<运算符
template<class T>
ostream& operator<<(ostream& out, const P<T>& x) {
...; // 将输出数据加载到 ostream 内存上
return out;
}
如以下代码:
template<class T>
void ArrayList<T>::output(ostream& out) const {
// copy 元素数组[element, element+list_siize]范围内的元素到输出迭代器上
copy(element, element + list_size, ostream_iterator<T>(cout, " "));
}
// 重载<<
template<class T>
ostream& operator<<(ostream& out, const ArrayList<T>& x) {
x.output(out);
return out;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)