<C++ 初阶> C++入门——函数重载

目录

1.函数重载概念

5.2名字修饰(name Mangling)

在C++环境下建立三个测试文件:abc.h    abc.cpp   Test.cpp

C/CPP程序如何调用CPP/C的静态库、动态库

5.4extern"C"

5.4.1 建立静态库

 5.4.2 调用静态库

5.4.3 C++程序调用C

5.4.4 C程序调用C++ 


1.函数重载概念

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序[不同类型的形参])必须不同,常用来处理实现功能类似数据类型不同的问题。

int Add(int a, int b)
{
	return a + b;
}

double Add(double a, double b)
{
	return a + b;
}

long Add(long a, long b)
{
	return a + b;
}

int main()
{
    Add(1, 2);
    Add(1.0, 2.0);
    Add(1L, 2L);
}

5.2名字修饰(name Mangling)

为什么C++支持函数重载而C语言不支持呢?

C++如何支持函数重载

在C/C++中,一个程序运行起来需要经历以下几个阶段:预处理、编译、汇编、链接。

1、预处理  —— 头文件展开、宏替换、条件编译、去除注释         test.i

2、编译      —— 检查语法、生成汇编代码                                     test.s

3、汇编      —— 把汇编代码转化成二进制的机器码                       test.o

4、链接      —— 找调用函数的地址,链接对应上,合并在一起     a.out

在C++环境下建立三个测试文件:abc.h    abc.cpp   Test.cpp

 abc.h 

abc.cpp

Test.cpp

 

对程序进行编译链接

abcc.cpp中有函数的声明和定义、Test.cpp中有函数的声明和调用,在汇编完成之后abc.o、Test.o中会生成函数调用指令符号表(记录函数名以及函数地址的映射)。Test.cpp中main函数的指令调用的函数在abc.cpp中定义,而在Test.cpp中只有声明没有定义,于是就执行链接到符号表中取得函数的地址对应上,但如果最后对应地址的函数没有定义好,程序执行就会报链接错误

为什么C语言不支持函数重载呢?

C语言编译的时候就用原来的函数名<abc><abc>

C语言在编译阶段发现名为<abc>的函数有两个,无法区分开来,编译不通过,编译报错。

C++如何支持函数重载

<_z    函数名长度    函数名    类型首字母>

C++在编译时对函数名进行修饰生成的两个函数名<_z3abcid><_z3abcdi>

C++在进行命名的时候将参数类型的首字母修饰带进命名规则中,从而将两个函数区分开来。

C/CPP程序如何调用CPP/C的静态库、动态库

5.4extern"C"

在C++工程中需要将某些函数按照C的风格来编译,在函数前加extern"C",告诉编译器,将该函数按照C语言规则编译。

extren "C" int Add(int a, int b);

int main()
{
    Add(1, 2);
    reutrn 0;
}

链接时报错:error LNK2019:无法解析外部符号_Add,该符号在函数_main中被引用。

5.4.1建立静态库

 

 

 5.4.2调用静态库

 

 

在当前文件夹跳出去找到刚刚建立的静态库的Stack.h所在位置

 

../  往上跳一层 

../../  往上跳两层

../../Stack_C/Stack_C/Stack.h  往上跳两层进到Stack_C文件夹中的Stack_C文件夹找到Stack.h

 

5.4.3 C++程序调用C

5.4.4C调用C++ (C++不能有函数重载)

Stack.h

有两种代码方式

1.

2.

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值