c++ 运算符重载

概述

  • 在c++中你自定义一个类,如果不重载对应的运算符,类对象之间是不能使用加、减等运算符号的,必须重载+运算符,类对象之间才可以进行加运算。
  • c++的运算符重载有类内重载和类外重载。
  • 使用类外重载,如果成员变量是私有的,必须加友元。一般类外重载比较形象。

知识点

一、单目运算符:运算所需变量为一个的运算符叫单目运算符,又叫一元运算符。在c语言里主要包括:

  1. 逻辑非运算符【!】
  2. 按位取反运算符【~】
  3. 自增自减运算符【++,–】
  4. 负号运算符【-】
  5. 类型转换运算符【(类型)】
  6. 指针运算符和取地址运算符【*,&】
  7. 长度运算符【sizeof】

二、单目运算符的限制:在全局函数中代入一个参数,就是该类的对象的引用。

  1. 参数只有1个,就是该类对象的引用,不需要改变对象自身的可以带const做保护。
  2. 如果此种计算要改变类对象本身,就不能加const。
  3. 返回值如果是返回传入的类对象自身,一般可以用该类的引用。
  4. 返回值如果是返回一个临时对象,则必须不能用引用变量,必须返回一个对象。

三、双目运算符:运算所需要变量为两个的运算符叫做双目运算符
例如:+,-,*,/,%,<,>,<=,>=,==,!=,<<,>>,&,&&,^,|,||,=
使用2个参数,运算符左边对象是第一个参数,运算符右边是传入的参数(一般用引用)

四、不允许重载的运算符只有5个:

  1. 成员访问运算符【.】
  2. 成员指针访问运算符【.*】
  3. 域运算符【::】
  4. 长度运算符【sizeof】
  5. 条件运算符【?:】

五、必须在类内重载的运算符:(),[],->,和赋值运算符=。

自定义类

这里我们自定义一个类,后面运算符的重载都是对该类的重载。

class CNumber
{
public:
	explicit CNumber(int nNum):m_nNumber(nNum)
	{}

	void Show() const {
		std::cout << m_nNumber << std::endl;
	}

private:
	int m_nNumber;
};

重载 小于 运算符

//类内重载
public:
	bool operator<(const CNumber& obj) const
	{
		return m_nNumber < obj.m_nNumber;
	}
//类内定义友元函数
friend bool operator<(const CNumber& obj1, const CNumber& obj2);

//类外重载
bool operator<(const CNumber& obj1, const CNumber& obj2)
{
	return obj1.m_nNumber < obj2.m_nNumber;
}
int main()
{
	CNumber num1(1);
	CNumber num2(2);
	bool bRt = num1 < num2;
	std::cout << bRt << std::endl;//1

	return 0;
 }

重载 加号 运算符

  • 双目运算符,类内类外都可以重载。
//类内重载
public:
	CNumber operator+(const CNumber& obj) 
	{
		int nNewNumber = this->m_nNumber + obj.m_nNumber;
		CNumber objNew(nNewNumber);
		return objNew;
	}
//类内定义友元函数
friend CNumber operator+(const CNumber& obj1, const CNumber& obj2);

//类外重载
CNumber operator+(const CNumber& obj1, const CNumber& obj2)
{
	int nNewNumber = obj1.m_nNumber + obj2.m_nNumber;
	CNumber objNew(nNewNumber);
	return objNew;
}
int main()
{
	CNumber num1(1);
	CNumber num2(2);
	CNumber num3 = num1 + num2;
	num3.Show();//3

	return 0;
}

重载 赋值 运算符

  • 只能在类内重载。
//类内重载
public:
	CNumber& operator=(const CNumber& obj)
	{
		this->m_nNumber = obj.m_nNumber;
		return *this;
	}
int main()
{
	CNumber num1(2);
	CNumber num2 = num1;
	num2.Show();//2

	return 0;
}

重载 类型转换 运算符

//类内重载
public:
	operator int()
	{
		return m_nNumber;
	}
int main()
{
	CNumber num1(2);
	int a = num1;
	std::cout << a << std::endl;//2

	return 0;
}

重载 取反 运算符

//类内重载
public:
	CNumber& operator!() 
	{
		this->m_nNumber = !this->m_nNumber;
		return *this;
	}
//类内定义友元函数
friend CNumber& operator!(CNumber& obj);

//类外重载
CNumber& operator!(CNumber& obj)
{
	obj.m_nNumber = !obj.m_nNumber;
	return obj;
}
int main()
{
	CNumber num1(1);
	!num1;
	num1.Show();//0

	return 0;
}

重载 取负值 运算符

//类内重载
public:
	CNumber& operator-()
	{
		this->m_nNumber *= -1;
		return *this;
	}
//类内定义友元函数
friend CNumber& operator-(CNumber& obj);

//类外重载
CNumber& operator-(CNumber& obj)
{
	obj.m_nNumber *= -1;
	return obj;
}
int main()
{
	CNumber num1(2);
	-num1;
	num1.Show();//-2

	return 0;
}

重载 加等于 运算符

//类内重载
public:
	CNumber& operator+=(const CNumber& obj)
	{
		this->m_nNumber += obj.m_nNumber;
		return *this;
	}
//类内定义友元函数
friend CNumber& operator+=(CNumber& obj1, const CNumber& obj2);

//类外重载
CNumber& operator+=(CNumber& obj1,const CNumber& obj2)
{
	obj1.m_nNumber += obj2.m_nNumber;
	return obj1;
}
int main()
{
	CNumber num1(2);
	CNumber num2(5);
	num1 += num2;
	num1.Show();//7

	return 0;
}

重载 前++ 运算符

//类内重载
public:
	CNumber& operator++()
	{
		++this->m_nNumber;
		return *this;
	}
//类内定义友元函数
friend CNumber& operator++(CNumber& obj);

//类外重载
CNumber& operator++(CNumber& obj)
{
	++obj.m_nNumber;
	return obj;
}
int main()
{
	CNumber num1(2);
	++num1;
	num1.Show();//3

	return 0;
}

重载 后++ 运算符

//类内重载
public:
	CNumber operator++(int)
	{
		CNumber obj = *this;
		++this->m_nNumber;
		return obj;
	}
//类内定义友元函数
friend CNumber& operator++(CNumber& obj,int);

//类外重载
CNumber& operator++(CNumber& obj,int)
{
	CNumber objNew = obj;
	++obj.m_nNumber;
	return objNew;
}
int main()
{
	CNumber num1(2);
	num1++;
	num1.Show();//3

	return 0;
}

重载 << 运算符

//类内重载
public:
	CNumber& operator<<(int nValue)
	{
		printf("%d",nValue);
		return *this;
	}
	CNumber& operator<<(double dValue)
	{
		printf("%lf", dValue);
		return *this;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值