返回数组指针
数组不能被拷贝,所以函数不能返回数组,不过,函数可以返回数组的指针或引用。
声明一个返回数组指针的函数,如下:
上面的含义是,返回一个指向大小为10的数组指针,数组中的元素是整形。C++ 11新标准使用尾置返回类型,在本应该出现返回类型的地方放置一个auto
:
也可以使用decltype
,如下,我们只知道返回一个指针的类型,但是不知道到底返回指向那个数组的指针:
decltype
并不负责把数组类型转换成对应的指针,所以decltype
的结果是个数组,要想表示arrPtr
返回指针还必须在函数声明时加一个*
符号。
函数重载
如果同一作用域内的几个函数名字相同但是形参列表不同,我们称之为重载函数。
不允许两个函数除了返回类型外其他所有要素都相同。如下:
重载与const形参
这个之前有提到过,一个拥有顶层const
的形参无法和另一个没有顶层const
的形参区分开来:
但是底层const
就可以实现重载:
内联函数和constexpr函数
在大多数机器上,一次函数调用其实包含着一系列工作:调用前要先保存寄存器,并在返回时恢复;可能需要拷贝实参;程序转向一个新的位置继续执行。
将函数指定为内联函数,通常就是将它在每个调用点上“内联地”展开,比如下面的函数定义为内联函数:
这样我们调用shorterString
函数的时候就会如下展开:
constexpr函数是指用于常量表达式的函数,其函数的返回类型及所有形参的类型都得是字面值类型,而且函数体中必须有且只有一条return语句:
允许constexpr
函数返回值并非是一个常量,也可以是常量表达式:
函数指针
函数指针指向的是函数而非对象,函数的类型由它的返回类型和形参类型共同决定,与函数名无关。
比如下面的函数:
该函数的类型是bool(const string&, const string&)
,要想申明一个可以指向该函数的指针,只需要用指针替换函数名即可:
这里*pf
两端的括号必不可少,如果不写这对括号,则pf是一个返回值为bool指针的函数:
使用函数指针:
重载函数的指针:
函数指针形参:
虽然不能定义函数类型的形参,但是形参可以是指向函数的指针。
可以直接把函数作为实参使用:
直接使用函数指针显得冗长,类型别名和decltype
能让我们简化使用函数指针的代码:
注意decltype
的结果是函数类型,所以只有在结果前面加上*
才能得到指针。
返回指向函数的指针:
直接声明: