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;
}

posted @   椒颜皮皮虾  阅读(61)  评论(0编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示