函数的重载

重载规则:

1.函数名相同
2.参数个数不同,参数的类型不同,参数顺序不同,均可构成重载。
3.只是返回值类型不同则不可以构成重载 ,如果只是类型不同,而且不计较函数的返回,只是调用 如func(),则系统很难判断出选择出重载中的哪个函数进行调用
4.使用const修饰的类成员函数与普通类成员函数(详细见const修饰类成员函数)

匹配原则:

1.严格匹配,找到则调用
2.通过隐式转换寻求一个匹配,找到则调用,隐式转换就是一些短的类型可以转换成等长或者长的类型,如int可以转为long和double,而长的类型不能隐式转换为短的类型,因为可能会损失精度

#include "stdafx.h"
#include <iostream>
using namespace std;

void print(long a)
{
	cout << "void print(long a)" << endl;
	cout << "a=" << a << endl;
}

void print(double a)
{
	cout << "void print(double a)" << endl;
	cout << "a=" << a << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
	print((long)1); print(1l);//后面加l进行类型控制

	//如果为 print(1);则会报错 因为1为int类型 int可以
	//隐式转为long或者double 与上面函数 产生二义性

	return 0;
}

命名倾轧 name mangling:

1.C++利用 name mangling(倾轧)技术来改名函数名,区分参数不同的同名函数(不同名的函数也会发生倾轧)
2.name mangling 发生在两个阶段,.cpp 编译阶段,和.h 的声明阶段,只有两个阶段同时进行,才能匹配调用(也就是.cpp和.h中的函数要都倾轧或者都不倾轧才能连接上,才能通过运行)

void func(char a);                   // func_c(char a)
void func(char a, int b, double c);  //func_cid(char a, int b, double c)

extern "C"(避免倾轧):

c++ 完全兼容 c 语言,那就面临着,完全兼容 c 的类库。由于.c 文件的类库文件中函数名,并没有发生 name manling 行为,而C++编译器在包含.c 文件所对应的.h 文件时,.h 文件要发生 name manling 行为,因而在链接的时候会发
生错误。 C++为了避免上述错误的发生,重载了关键字 extern。只需要在要避免 name manling 的函数前,加 extern "C" 如有多个,则 extern "C"{}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值