03~C++函数重载

1. 函数重载定义

函数名相同,参数表不同的一组函数。这样的一组函数之间称为重载

示例中load函数有四个版本,彼此构成重载关系

1.1 参数类型/个数不同形成重载

//overload.cpp
#include <iostream>
using namespace std;
void load (int)
{
	cout << "load int version" << endl;
}

void load(double)
{
	cout << "load double version" << endl;
}

void load(int a , int b)
{
	cout << "load int, int version" << endl;
}
void load(int a, double)
{
	cout << "load int, double version" << endl;
}
int main ()
{	
	load(99);
	load(99.9);
	load(99,99);
	load(99, 99.9);
	return 0;
}

以上示例代码输出为:
load int version
load double version
load int, int version
load int, double version

使用g++编译出以上四个重载关系的函数,nm a.out 显示其函数表如下:
0000000000400870 T _Z4loadd
0000000000400846 T _Z4loadi
00000000004008c9 T _Z4loadid
000000000040089c T _Z4loadii
不难猜测,编译器根据函数调用时参数的类型决定调用哪一个函数。

1.2 参数常属性不同形成重载

最佳匹配:
非常实参 匹配非常形参版本
常实参匹配常形参版本

其次:
当非常实参参与调用,但是没有非常形参函数声明时。常形参版本可以形成非常实参的匹配(本例没有做代码说明)

#include <iostream>
using namespace std;
class HeyBaby{
public:
	void baby_show(int& toy)
	{	
		cout << "baby play with toy, toy could be damaged!!!" << endl;
	}
	void baby_show (int const& toy)
	{
		cout << "baby play with toy, toy could not be damaged!!!" << endl;
	}
	
};
int main (void)
{
	int val1 = 1;
	int const val2 = 2;
	HeyBaby Baby(100,99);
	
	Baby.baby_show(val1);
	Baby.baby_show(val2);	

	return 0;
}

1.3 部分函数修饰符不同,也会形成重载

this 指针的常属性也成为函数重载的原因

#include <iostream>
using namespace std;
class Eg {
public:
	int show (void)const {
		cout << "const version show" << endl;
		return 10;
	}
	int show (void) {
		cout << "none const version show" << endl;
		return 9;
	}
};
int main(){

Eg const c1;
Eg c2;
c1.show();
c2.show();
return 0;
}

这里先卖个关子,int show(void) const 修饰的是 this指针!!!
调用者会根据对象的常属性匹配带有常属性的成员函数!!!

2. 重载解析过程

示例中的两个fool函数,因为类型不一致,可以形成重载关系;
但是编译过程中,编译器会发现两个重载版本和调用都完全匹配,所以报编译错误—通过这个例子我们可以看到编译器重载解析(选择合适的被调函数)这一过程

#include <iostream>
#include <string>
using namespace std;
void fool(int )
{
	cout << "fool(int)" << endl;
}

void fool(int&)
{
	cout << "fool(int&)" << endl;
}


int main(void) {
	int a = 100;
	/*重载解析错误,注释掉了*/
	//fool(a);
	int& i = a;
	/*注释原因 同上,目前的代码是可以编译通过的*/
	//fool(i);
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值