C++ 基础知识九

一.运算符重载

所谓重载,就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义,使之实现新功能,因此,一个函数名就可以用来代表不同功能的函数,也就是”一名多用”。
 
运算符也可以重载。实际上,我们已经在不知不觉之中使用了运算符重载。例如,大 家都已习惯于用加法运算符”+”对整数、单精度数和双精度数进行加法运算,如5+8, 5.8 +3.67等,其实计算机对整数、单精度数和双精度数的加法操作过程是很不相同的, 但由于C++已经对运算符”+”进行了重载,所以就能适用于int, float, double类型的运算。
 
又如”<<“是C++的位运算中的位移运算符(左移),但在输出操作中又是与流对 象cout 配合使用的流插入运算符,”>>“也是位移运算符(右移),但在输入操作中又是与流对象 cin 配合使用的流提取运算符。这就是运算符重载(operator overloading)。C++系统对”<<“和”>>“进行了重载,用户在不同的场合下使用它们时,作用是不同 的。对”<<“和”>>“的重载处理是放在头文件stream中的。因此,如果要在程序中用”<< “和”>>”作流插入运算符和流提取运算符,必须在本文件模块中包含头文件stream(当然还应当包括”using namespace std“)。


1为什么会用运算符重载机制
      用复数类举例
      Complex c3 = c1 + c2;
     原因 Complex是用户自定义类型,编译器根本不知道如何进行加减
      编译器给提供了一种机制,让用户自己去完成,自定义类型的加减操作。。。。。
      这个机制就是运算符重载机制
2 运算符重载的本质是一个函数

3. + - 重载

#include <iostream>

using namespace std;

class Complex
{
	friend Complex operator+ (Complex &c1,Complex &c2);
	friend Complex operator- (Complex &c1,Complex &c2);
public:
	Complex(int a,int b)
	{
		this->a = a;
		this->b = b;
	}
	void print()
	{
		cout << a << "+" << b << "i" << endl;
	}

private:
	int a;
	int b;
};
// + 重载
Complex operator+ (Complex &c1,Complex &c2)
{
	Complex tmp(c1.a+c2.a,c1.b+c2.b);

	return tmp;
}
// - 重载
Complex operator- (Complex &c1,Complex &c2)
{
	Complex tmp(c1.a-c2.a,c1.b-c2.b);

	return tmp;
}


int main()
{
	Complex c1(10,20);
	c1.print();

	Complex c2(1,2);  //Complex 是自定义的类,编译器不知道如何运算,所以对+ - 进行重载,重新赋予含义
	Complex c3 = c1+c2; // operator+(c1,c2)
	c3.print();

	Complex c4 = c2 - c1;//operator-(c1,c2)
	c4.print();

	return 0;
}

4.一元运算符重载++   --

可以用成员函数重载也可以用友元函数重载

#include <iostream>

using namespace std;

class Complex
{
	friend Complex &operator++(Complex &c);
	friend Complex operator++ (Complex &c,int);

	friend Complex &operator--(Complex &c);
	friend Complex operator--(Complex &c,int);
public:
	Complex(){}
	Complex(int a,int b)
	{
		this->a = a;
		this->b = b;
	}

	void print()
	{
		cout << a << "+" << b << "i" << endl;
	}

private:
	int a;
	int b;
};
// + 重载
Complex operator+ (Complex &c1,Complex &c2)
{
	Complex tmp(c1.a+c2.a,c1.b+c2.b);

	return tmp;
}
// - 重载
Complex operator- (Complex &c1,Complex &c2)
{
	Complex tmp(c1.a-c2.a,c1.b-c2.b);

	return tmp;
}

//前置++ 重载
Complex &operator++(Complex &c)
{
	++c.a;
	++c.b;

	return c;
}

//后置++ 重载
//为区别前置++,后置++ 重载函数参数列表中,用占位参数来区别
Complex operator++ (Complex &c,int)
{
	c.a++;
	c.b++;

	return c;
}

//前置——
Complex &operator--(Complex &c)
{
	--c.a;
	--c.b;

	return c;
}

//后置--
Complex operator--(Complex &c,int)
{
	c.a--;
	c.b--;

	return c;
}

int main()
{
	Complex c1(10,20),c2(2,3),c3,c4;
	c3 = --c1;
	c3.print();

	c4 = c1--;
	c4.print();
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值