函数重载
在C语言中,函数不可以重复出现一个函数名,但在C++是允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型、顺序)必须不同。
#include <iostream> 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, 30); Add(10.0, 30.0); Add(10L, 30L); return 0; }
那么在C语言中为什么不能实现函数的重载呢?
在C和C++环境中创建函数名为int Add(int a, int b)的函数,C++中生成的函数名如下图所示,编译器会对函数所在作用域中同一函数名的函数根据函数形参的类型和顺序进行重命名,因此每个函数看似名字相同,但其实都是有区别的。但在C语言中,代码通过编译后,编译器不会根据进行重新命名,只会简单的给函数进行重命名,这就是C不能实现函数重载的原因。
Add(10, 30); 002B53AE push 1Eh 002B53B0 push 0Ah 002B53B2 call Add (02B1118h) 002B53B7 add esp,8 Add(10.0, 30.0); 002B53BA sub esp,8 002B53BD movsd xmm0,mmword ptr ds:[2BCD90h] 002B53C5 movsd mmword ptr [esp],xmm0 002B53CA sub esp,8 002B53CD movsd xmm0,mmword ptr ds:[2BCD80h] 002B53D5 movsd mmword ptr [esp],xmm0 002B53DA call Add (02B1014h) 002B53DF fstp st(0) 002B53E1 add esp,10h Add(10L, 30L); 002B53E4 push 1Eh 002B53E6 push 0Ah 002B53E8 call Add (02B101Eh) 002B53ED add esp,8
引用
引用不是新定义的一个变量,而是给已存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它的引用变量公用一块内存空间。类型&引用变量名(对象名) = 引用实体,但类型必须和引用实体的类型相同。
引用的特性
引用在定义时必须初始化。
同时一旦引用了一个实体,再不能引用其他实体。
一个变量可以有多个引用。
使用场景
作为函数的形参
void Add(int& a, int& b) { return a + b; }
作为函数的返回值
int & TestRefReturn(int& a) { a += 10; return a; }
引用和指针的区别
相同点:
引用和指针在底层实现方式都是按照指针来实现的。
不同点:
引用是使用时必须要初始化,指针没有要求初始化;
一个引用被初始化指向一个对象是就不能再指向其他对象,而指针可以在任何时候改变指向对象;
引用空(NULL)引用,但有空(NULL)指针;
引用sizeof()函数是结果为引用类型的大小,但指针的结果是地址*空间所占字节的个数;
引用自加改变变量的内容,指针自加改变指针的方向;
有多级指针,但没有多级引用;
指针需要手动寻址,但引用是通过编译器实现寻址;
引用比指针使用起来更安全。
为什么引用比指针使用更安全?
在调用某一指针,指针不为空,但其指向的内容已经被删除,这就可能会让系统发生崩溃,但引用不会,引用永远不可以为空,因此引用更为安全。