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 的时候, 和第一个函数达到了更好的匹配.
但是检查第二个参数的时候, 和第二个函数达到了更好的匹配, 因此编译器无法选择, 会报错.

转换方法优劣评分按照如下进行:

  1. const转换
  2. 类型提升 (char到int, short 到 int)
  3. 算数转换 (所有算数转换的权重都一样, 比如从int到float和到long)
  4. 类类转换

指向函数的指针

按照形参类型和返回值精准分类, 互相不可转换.

声明: 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);
上一篇下一篇

猜你喜欢

热点阅读