概念:
如果同一作用域里几个函数的名字相同但形参列表不相同,我们称之为重载(overload)
它们这些函数接受的参数不一样,但执行的操作非常类似,当调用这些函数时,编译器会根据传递的实参类型推断想要的是哪个函数,它的存在在一定上减轻了程序员记名字的负担
eg:
void print(const char*cp)
void print(const int *beg,const int *end)
void print(const int ia[],size_t size)
这种思想在数据库里面都有体现:
record lookup(const account&);
record lookup(const phone&)
record lookup(const name&)
虽然三个函数的作用各不相同,但三个函数使用了同样的名称,调用哪一个,根据传入的参数,由编译器来判断
判断两个形参的类型是否不同
有时会省略形参的名字
record lookup(const account &acct)
record lookup(const account &)
或者两个形参名称不同,但代表了同一个东西
typedef phone telno
record lookup(const phone&)
record lookup(const telno&)
重载和const形参
我们只能把const对象传递给const形参,因为非常量可以转换成const
一个顶层const无法和另一个没有顶层const的形参区别开来
const_cast的作用,cast这个词有铸造的意思,在这里它主要是用来去掉与加上const属性,当我们需要使用指针去修改一个常量的值得时候,可以使用const_cast函数去除这个值得常量属性
重载可能会发生的三种情况
- 编译器找到一个与实参最佳匹配的函数,并调用该函数的代码
- 找不到任何一个与函数相匹配的实参,此时编译器发出无匹配的错误信息
- 有多个函数可以匹配,但每一个都不是最佳选择,此时编译器会发生错误,被称为二义性调用
重载在作用域中的屏蔽效应
如果我们在函数内部声明,它将屏蔽外层的重载函数
eg:
string read();
void foobar(int ival)
{bool read=false;string s=read()//!!!!错误,read 是一个布尔值,不是函数!
}
默认实参
默认参数背后的想法很简单。如果通过传递参数调用函数,则这些参数将由函数使用。
但是,如果在调用函数时未传递参数,则使用默认值。
默认值传递给函数原型中的参数。
eg:
string screen(sz,sz,char=' ');
string screen(sz=24,sz=80,char)
局部变量不能作为实参
内联函数与constexpr函数
wiki中内联函数的概念:
在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省了每次调用函数带来的额外时间开支。但在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡,因为过多的比较复杂的函数进行内联扩展将带来很大的存储资源开支。另外还需要特别注意的是对递归函数的内联扩展可能引起部分编译器的无穷编译。