C++中重载操作符

什么是重载操作符?

重载操作符(Operator Overloading)是面向对象编程中的一种技术,它允许程序员为自定义的数据类型(如类或结构体)重新定义或扩展标准操作符(如 +-*/ 等)的行为。这使得这些操作符可以用于用户定义的对象,就像它们可以用于内置的基本数据类型(如整数、浮点数)一样。

为什么要重载操作符?

重载操作符的主要目的是增强类的可用性和可读性,使自定义的类能够像内置类型一样自然地使用操作符。例如,当我们为一个Complex类重载了+操作符后,可以直接用类实例化的对象a + b来表示两个复数的相加,而不是调用一个成员函数a.add(b)。这不仅使代码更简洁明了,还提高了代码的可维护性和可读性。

示例:
1.重载输入输出符
#include<iostream>
using namespace std;

class Num
{
private:
	int a;
public:
	Num(int n)
	{
		a = n;
	}
	Num() {}//定义一个无参构造
	friend istream& operator>>(istream& is, Num& num);
	friend ostream& operator<<(ostream& os, Num& num);
};


istream& operator>>(istream& is, Num& num)
{
	is >> num.a;
	return is;
}
ostream& operator<<(ostream& os, Num& num)
{
	os<< num.a<< endl;
	return os;
}

int main()
{
	Num num;

	/*cin 和 cout 是C++标准库中的输入和输出流对象,
	用于与用户进行交互。
	它们分别属于 std::istream 和 std::ostream 类,
	定义在 <iostream> 头文件*/
	cin >> num;//   >> (两个参数 左参数为 输入cin 右参数为 num)
	cout << num << endl;


	return 0;
}

结果:

2.重载=
#include<iostream>
using namespace std;
class AA
{
public:
	int* p;
public:
	AA()
	{
		p = new int(100);
		cout << "AA" << endl;
	}
	~AA()
	{
		delete p;
		cout << "~AA" << endl;
	}
public:
	//返回类型为 AA& 是赋值操作符重载的标准做法
	AA& operator=(AA& ra)
	{
		if (p == NULL)
		{
			p = new int;//规避内存泄漏
		}
		*p = *ra.p;
		return ra;
	}
};
int main()
{
	AA aa;
	cout << *aa.p << endl;
	
	*aa.p = 120;
	AA bb;
	bb = aa;



	cout << *bb.p << endl;
	return 0;
}

结果:

3.重载操作符注意事项

#include<iostream>
using namespace std;
class Num
{
private:
	int a;
public:
	Num(int n)
	{
		a = n;
	}
public:
	int operator=(int n);
	int operator+(int n);
		//对象作为做左参数 可以在类内重载 
		//对象作为做右参数 必须在类外重载 

public:
	friend int operator+(int n, Num& ra);
};

int Num::operator=(int n)
{
	a = n;
	return n;
}

int Num::operator+(int n)
{
	return n+a;
}

int operator+(int n, Num& ra)
{
	return n + ra.a;//需要加上一个friend
}
int main()
{
	Num n=100;// 当直接对对象初始化时  执行的是有参构造

	n = 20;//这里会执行一个"="的重载 如果自己不定义重载
	//会有一个默认的重载 把n赋值给a


	int num1 = n + 10;
	//对象作为做左参数 可以在类内重载 
	//对象作为做右参数 必须在类外重载 
	int num2 = 10 + n;
	cout << num1 << "  " << num2 << endl;
	return 0;
}
特别注意:
  • sizeof()   ::   .      ?:(三木运算不可以重载)
  • 对操作符重载 不会改变优先级和结合性 
  • 重载操作符不允许使用默认参数
  • ->  []  =   ()  必须在类内重载 不可以在类外重载
  • 对象作为做左参数 可以在类内重载 
  • 对象作为做右参数 必须在类外重载 
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值