Chapter 6 Functions
2020-03-11 本文已影响0人
再凌
不定长度形参初始化
两种方法,一种是传统的C语言风格...
另一种则是当参数类型一致时可使用initializer_list<TYPE> name
注意, 声明的序列都是const类型, 不可更改.
返回初始化列表
vector<string> f()
{
return {"space", "is", "empty"}
}
注意要用大括号包起来
返回指向数组的指针
这个指针应当以如下方式定义:
//类比此类变量的定义
int a[10];
int (*p)[10] = &a;
//函数定义
int (*function(int arg))[10];
//或者利用 typedef/ using
using myarray = int[10];
myarray *function(int arg);
//或者利用decltype(), 别忘了*
decltype(a) (*function(int arg))
//或者利用尾指针
auto function(int arg) ->int (*) [10]
const 和重载
重载函数中对于指针, 引用的顶层const (即, 和变量最近的那个 const) 会被忽略. 底层const可以重载出不同的函数. 如果存在, 则优先调用const版本.
对于一个写好的, 形参是const 类型的函数, 我们如果想再写一个面向非const的函数, 可以考虑使用const_cast
关键字.
新增加的函数:
string &function(string &s)
{
auto &r = function( const_cast<const string&> s);
return const_cast<string &> s;
}
显然, 在这里使用const_cast是安全的
重载匹配
int fun(int, int);
int fun(double, double);
fun(1, 1.5);
当有多个函数可以匹配, 但都不是最佳匹配的时候, 编译器将检查参数是否最佳, 显然,当第一个参数是int 的时候, 和第一个函数达到了更好的匹配.
但是检查第二个参数的时候, 和第二个函数达到了更好的匹配, 因此编译器无法选择, 会报错.
转换方法优劣评分按照如下进行:
- const转换
- 类型提升 (char到int, short 到 int)
- 算数转换 (所有算数转换的权重都一样, 比如从int到float和到long)
- 类类转换
指向函数的指针
按照形参类型和返回值精准分类, 互相不可转换.
声明: bool (*p)(string &, string &);
赋值: p = isLarger;
还可以使用decltype完成, 不做赘述
还可以使用typedef完成.
typedef bool (*f)(string &, string &)
被调用的时候可以
int something(int a, bool (*pf)(string &, string &));
//等同于
int something(int a,f);