c++ 函数重载 与引用
Posted 程序猿是小贺
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 函数重载 与引用相关的知识,希望对你有一定的参考价值。
函数重载
背景:自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。 比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前 者是“谁也赢不了!”,后者是“谁也赢不了!”
函数重载概念
函数重载:是函数的一种特殊情况,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(10, 20);
Add(10.0, 20.0);
Add(10L, 20L);
return 0;
}
注:函数重载与返回值类型是否相同无关,只有返回值类型不同则不构成重载
short Add(short l, short r)
{
return l+r;
}
int Add(short l, short r)
{
return l+r;
}
这两个函数只是返回值不同,并不构成函数重载。
函数重载调用原理
在编译阶段,编译器会对函数实参类型进行推演,根据推演的结果选择合适的函数进行调用,如果有合适的函数则调用,么有的话则会进行隐式类型转化,转化后有则调用,还没有则会报错。
在底层的实现原理: 实在编译阶段根据实参的类型来确定到底调用哪个重载方法
在C++调用约定(_cdecl 调用约定)中Add函数在底层被解析为:
"int __cdecl Add(int,int)" (?Add@@YAHHH@Z)
"double __cdecl Add(double,double)" (?Add@@YANNN@Z)
"long __cdecl Add(long,long)" (?Add@@YAJJJ@Z)
extern C
在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?
- C++中可以通过在函数声明前加 extern "C" 将一个函数按照 C 语言的风格来进行编译。
- C++语言支持函数重载。而C不支持函数重载。
- 函数在C中和C++中编译过的函数名字是不一样的。加上extern”C”是说明是说明C已经编译过的。
例如:假设某个函数的原型为: void fun(int x, int y);该函数被C 编译器编译后在库中的名字为_fun, 而C++ 编译器则会产生像_fun_int_int 之类的名字,加上extren”C”后,就相当于告诉编译器,函数fun是个C编译后的函数,在库里应该找的是_fun,而不是_fun_int_int。
2.引用
2.1概念
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它 引用的变量共用同一块内存空间。
类型& 引用变量名(对象名) = 引用实体;
int &ra = a;
注意:引用类型必须和引用实体是同种类型的
2.2引用特性
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用一旦引用一个实体,再不能引用其他实体
2.3常引用
常引用声明方式:const 类型标识符&引用名=目标变量名。
const int& ra = a;
用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性。
2.4 使用场景
1. 做参数
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
2. 做返回值
int& Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int& ret = Add(1, 2);
Add(3, 4);
cout << "Add(1, 2) is :"<< ret <<endl;
return 0;
}
注意:如果函数返回时,出了函数作用域,如果返回对象还未还给系统,则可以使用引用返回,如果已 经还给系统了,则必须使用传值返回。
在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。
2.5引用和指针的不同点
- 引用在定义时必须初始化,指针没有要求
- 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
- 没有NULL引用,但有NULL指针
- 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占 4个字节)
- 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
- 有多级指针,但是没有多级引用
- 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
- 引用比指针使用起来相对更安全
以上是关于c++ 函数重载 与引用的主要内容,如果未能解决你的问题,请参考以下文章
C++ 初阶 新语言入门介绍:命名空间,(全/半)缺省函数,函数重载,引用,内联,auto