在返回引用这种情况下,注意不要返回局部变量的引用,因为局部变量在函数体内定义,当函数执行完后就销毁了,所谓的引用也就没有意义了。同理,不要返回指向局部变量的指针。
三、重载函数
出现在相同作用域中的两个函数,如果具有相同的名字而形参不同,则称为重载函数。
1)注意区分函数重载与重复声明
有些看起来不同的形参,本质是相同的。下面中的都是重复声明的例子
typedef double newDouble; int func(double i); int func(newDouble i); // 没有新类型 int func1(int, int = 1); //只是提供默认参数 int func1(int ,int); int func2(int); int func2(const int); //对于普通非引用形参用cosnt修饰是没有意义的
2)重载与作用域
局部声明的函数,将屏蔽所有全局作用的同名函数。下面例子显示,即使全局作用的函数更加匹配调用的实参类型,但是仍然调用的是局部的函数。
void print(int); int main() { void print(double); print(42); return 0; }
上面程序中,将调用void print(double)函数,虽然42是int型。
3)重载确定的三个步骤
如果定义了众多的函数重载,将存在函数调用到底与哪个重载函数相匹配的问题。我们通过下面的示例代码来说明问题:
void f(); // 1 void f(int);// 2 void f(double);// 3 void f(int, int);// 4 void f(double, double);// 5
第一步:确定候选函数
假如我们调用f(4.2),那么先找到同名函数,并且在作用域内可见,上面例子中5个函数都满足。
第二步:选择可行的函数
必须满足2个条件:一是函数形参与该调用实参个数相同;第二,每个实参的类型必须与对应的类型匹配,或者可以被隐式转换为对应的形参类型。这里我们再调用f(4.2)时,排除了1、4、5号函数,只剩下2与3。其中2号函数可以通过类型转换来满足。
第三步:寻找最佳匹配
在经过第二步确定后,剩下2与3函数,那么2需要进行类型转换,显然3是最佳匹配了。
但是如果这样调用f(42,4.2)。这时候就会出现二义性,编译器将提示。