第008课 C++ 函数重载与运算符重载

一、函数重载:

    函数重载是一种特殊情况,C++允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。        所谓函数的重载是指完成不同功能的函数可以具有相同的函数名。 C++的编译器是根据函数的实参来确定应该调用哪一个函数的。

例: 

#include <iostream>
using namespace std;

// 函数重载,函数名相同,函数形参数据类型不同、或是函数形参个数不同
int add(int a, int b)
{
	cout << " 调用整型类型" << endl;
	return a + b;
}
int add(char a, char b)
{
	cout << " 调用字符类型" << endl;
	return a + b;
}
double add(double a, double b)
{
	cout << " 调用双精度数据类型" << endl;
	return a + b;
}

int main()
{
	cout << " 两数相加:" << add(30, 50) << endl << endl; //根据实参的不同,调用不同的重载函数
	cout << " 两数相加:" << add('A', 'B') << endl << endl;
	cout << " 两数相加:" << add(23.45, 50.25) << endl << endl;
	return 0;
}

 输出结果:

 二、运算符重载:

    可以重定义或重载大部分 C++ 内置的运算符。这样,您就能使用自定义类型的运算符。     

    重载的运算符是带有特殊名称的函数函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。     

    Box operator+(const Box&); //函数名是由关键字 operator 和 其后要重载的运算符符号构成的

     声明加法运算符用于把两个 Box 对象相加,返回最终的 Box 对象。大多数的重载运算符可被定义为普通的非成员函数或者被定义为类成员函数。如果我们定义上面的函数为类的非成员函数,那么我们需要为每次操作传递两个参数,如下所示:     

   Box operator+(const Box&, const Box&);

 在C++中,允许重载的运算符如下:

 在C++中,不允许重载的运算符如下:

 1、重载运算符和重载函数     

     一元运算符只对一个操作数进行操作,下面是一元运算符的实例:         

           递增运算符( ++ )和递减运算符( -- )         

           一元减运算符,即负号( - )         

          逻辑非运算符( ! )     

    一元运算符通常出现在它们所操作的对象的左边,比如 !num-num 和 ++num,但有时它们也可以作为后缀,比如 num++num--

2、二元运算符重载     

     二元运算符需要两个参数,下面是二元运算符的实例。我们平常使用的运算符( + )、运算符( - )、运算符( * )和运算符( / )都属于二元运算符。就像加(+)运算符。

【重载 加运算符( + )】

例:

#include <iostream>
using namespace std;

class Box
{
	double l; //长度
	double b; //宽度
	double h; //高度
public:
	Box()
	{
		l = 0;
		b = 0;
		h = 0;
	}
	void setl(double length)
	{
		l = length;
	}
	void setb(double breadth)
	{
		b = breadth;
	}
	void seth(double hight)
	{
		h = hight;
	}
	double getV() //求体积
	{
		return l * b * h;
	}
	// 重载 + 运算符,用于把两个Box对象进行相加
	Box operator+(const Box& b)
	{
		Box box;
		box.l = this->l + b.l;
		box.b = this->b + b.b;
		box.h = this->h + b.h;
		return box;
	}
};

int main()
{
	Box box1; //定义对象box1, 类型为Box
	Box box2;
	Box box3;
	double dv = 0.00; //存储体积变量

	//为第一个对象赋值box1
	box1.setl(2.00);
	box1.setb(3.00);
	box1.seth(4.00);

	//为第一个对象赋值box2
	box2.setl(5.00);
	box2.setb(6.00);
	box2.seth(7.00);

	// 输出box1体积
	dv = box1.getV();
	cout << " box1对象的体积为:" << dv << endl << endl;

	// 输出box2体积
	dv = box2.getV();
	cout << " box2对象的体积为:" << dv << endl << endl;

	//把两个对象相加,得到box3
	box3 = box1 + box2; //运算符+重载,计算原理:(2+5)*(3+6)*(4+7)= 7*9*11 = 693

	// 输出box3体积
	dv = box3.getV();
	cout << " box3对象的体积为:" << dv << endl << endl;

	return 0;
}

输出结果: 

3、++ 和 -- 运算符重载     

            递增运算符( ++ )和 递减运算符( -- )是 C++ 语言中两个重要的一元运算符。 

 【重载 递增运算符( ++ )】

例: 

#include <iostream>
using namespace std;

class TestSS
{
	int i;
public:
	TestSS() :i(0) {
		
	}
	TestSS operator++()
	{
		cout << " 调用前置递增" << endl;
		TestSS obj;
		obj.i = ++i;
		return obj;
	}

	//括号中插入int 表示后缀
	TestSS operator++(int)
	{
		cout << " 调用后置递增" << endl;
		TestSS obj;
		obj.i = i++;
		return obj;
	}

	void disp()
	{
		cout << " i=" << i << endl ;
	}
};

int main()
{
	TestSS obj1, obj2;
	cout << " 单目运算符(++)重载" << endl;
	
    cout << " 输出结果1为:" << endl;
	obj1.disp();
	obj2.disp();
	cout << endl;

	//调用运算符函数,然后将obj1的值赋给obj2
	obj2 = ++obj1; //前置调用
	cout << " 输出结果2为:" << endl;
	obj1.disp();
	obj2.disp();
	cout << endl;

	obj2 = obj1++; //后置调用
	cout << " 输出结果3为:" << endl;
	obj1.disp();
	obj2.disp();

	return 0;
}

输出结果: 

 【重载 递减运算符( -- )】 

例: 

#include <iostream>
using namespace std;

class TestSS
{
	int x;
public:
	TestSS() :x(10) {

	}
	TestSS operator--()
	{
		cout << " 调用前置递减" << endl;
		TestSS obj;
		obj.x = --x;
		return obj;
	}

	//括号中插入int 表示后缀计算方式
	TestSS operator--(int)
	{
		cout << " 调用后置递减" << endl;
		TestSS obj;
		obj.x = x--;
		return obj;
	}

	void disp()
	{
		cout << " x=" << x << endl;
	}
};

int main()
{
	TestSS obj1, obj2;
	cout << " 单目运算符(--)重载" << endl;
	cout << " 输出结果1为:" << endl;
	obj1.disp();
	obj2.disp();
	cout << endl;

	//调用运算符函数,然后将obj1的值赋给obj2
	obj2 = --obj1; //前置调用
	cout << " 输出结果2为:" << endl;
	obj1.disp();
	obj2.disp();
	cout << endl;

	obj2 = obj1--; //后置调用
	cout << " 输出结果3为:" << endl;
	obj1.disp();
	obj2.disp();

	return 0;
}

 输出结果: