6.4 函数重载
重载函数:函数名相同函数形参不同。
定义重载函数:
不允许两个重载函数返回值类型不同,其余相同。
一个拥有顶层const的形参无法与没有顶层const形参的重载函数区分开来。
6.4.1 重载与作用域
如果在内层作用域中声明名字,它将隐藏外层作用域中声明的实体。
string read();
void print(const string &);
void print(double);
void fooBar(int ival)
{
bool read = false;
string s = read();
void print(int); //新作用域,隐藏了之前的print
print("Value: ");
print(ival);
print(3.14); //合法,调用print(int); print(double)被隐藏掉了。
}
6.5 特殊用途语言特性
6.5.1 默认实参
typedef string::size_type sz;
string screen(sz ht = 24,sz wid = 80,char backgrnd = ' ');
//为每一个形参提供了默认实参
string window;
window = screen(); //默认实参
window = screen(66); //screen(66,80,' ');//以此类推
多次声明一个函数也是合法的,但是在给定的作用域中一个形参只能被赋予一次默认实参。
6.5.2 内联函数和constexpr函数
使用函数存在一个潜在的缺点:调用函数一般比求等价表达式的值要更慢一些。
内联函数可以避免函数调用的开销。
在函数类型前面加上inline,这样就可以将他声明为内联函数。
inline const string &
shorterString(const string &s1, const string &s2)
{
return s1.size() <= s2.size() ? s1 : s2;
}
6.6 函数匹配
寻找最佳匹配
void f();
void f(int);
void f(int,int);
void f(double,double = 3.14);
f(5.6);
f(34,2.56);
在此例子中选择f(double,double = 3.14),此函数与实参精确匹配。第一个形参为5.6,第二个为默认实参。
采用f(34,2.56)时,编译器会因为这个调用具有二义性而拒绝其要求。