C++ Primer第五版之(四)函数

参数传递

  1. 形参是一种自动对象
    ①形参为引用类型时,将形参绑定到对应的实参,否则将实参的值拷贝给形参。
    ②使用引用类型形参可避免拷贝,引用形参还适用返回多个结果情况。
    ③函数不改变引用形参的值时可声明为常量引用。
    ④当形参有顶层const时,常量对象和非常量对象实参都可。
    ⑤形参忽略顶层const,重载函数无法区分相同形参列表下const的不同。

  2. 数组形参
    ①数组的两个特殊性质,不允许拷贝数组,数组名会转换成指针。
    ②数组不越界,使用三种常用技术:a.数组本身包含结束标志,例C风格字符串;b.使用标准库规范(begin和end)传递首指针和尾后指针;c.显式传递数组大小形参。

  3. 传递多维数组
    ①void print(int(*matrix)[10], int rowsize);matrix为指向数组的指针,等价于void print(int matrix[ ][10], int rowsize)。
    ②int matrix[ ][10],编绎器忽略掉第一个维度,声明看起来是一个二维数组,实际上形参是指向数组的指针。

可变形参

  1. C++11提供三种方法处理可变实参的函数。
    ①一实参类型相同,使用initializer_list的标准库类型,二实参类型不同,使用可变参数模板(后续介绍),三省略符形参。
    ②initializer_list和vector一样是一种模板类型,对象中的元素为常量值。
    ③省略符形参是为了便于C++程序访问特殊C代码设置。

  2. initializer_list形参,定义在它的同名头文件中,操作如下:
    ①initializer_list<T> lst; 默认初始化,T类型元素的空列表
    ②initializer_list<T> lst{a, b, c…}; lst的元素数量和初始值一样多,lst元素是对应初始值的副本,列表中的元素是const
    ③lst2(lst); 拷贝或赋值initializer_list的对象,不拷贝对象中的元素,拷贝后原始列表和副本共享元素
    ④lst2 = lst;
    ⑤lst.size(); 列表中元素数量
    ⑥lst.begin(); 返回指向lst中首元素的指针
    ⑦lst.end(); 返回指向lst中尾后元素的指针

  3. 省略符形参
    ①省略符形参设置是便于C++程序访问特殊C代码的,代码使用C标准库的varargs功能。
    ②应用于C和C++通用类型,出现在形参列表的最后一个位置。
    ③省略符形参对应的实参无须类型检查。
    ④大多数类类型的对象传递省略符形参时无法正确拷贝。

函数返回

  1. C++11新规定,函数可以返回花括号包围的值的列表,例返回vector。

  2. 返回指向数组指针的函数,type(*function(parameter_list)) [dimension],形参列表及数组维度跟在函数名字后面,形参列表先于数组维度。

  3. 使用尾置返回类型,auto func (int i) -> int (*)[10]。

  4. 无返回值函数:
    ①返回void的函数不要求必须有return语句,函数最后一句会隐式地执行return。
    ②也可以返回另一个返回void的函数。
    ③main函数允许没有return语句直接结束,编绎器隐式插入一条返回0的return语句。

函数重载与匹配

  1. 函数重载要素:
    ①拥有顶层const的形参无法和没有顶层const的形参区分开。
    ②如果形参是某种类型的指针或引用,通过底层const可以区分指向的是常量对象还是非常量对象,实现函数重载。
    ③其他要素相同返回类型不同时无法区分,不可重载。

  2. 选定本次调用对应的重载函数集,一与调用函数同名,二函数声明在调用点可见。
    ①确定候选函数,再考察本次调用提供的实参从候选函数中选出能被实参调用的函数称可行函数。
    ②一形参数量与调用提供实参数量相等,二实参类型与对应形参类型相同,或是可转换成形参的类型,如果无可行函数,编绎器报无匹配函数的错误。
    ③寻找最佳匹配,实参类型与形参类型越接近,匹配越好。

函数指针

  1. bool (*pf) (const string&, const string&);声明指向函数的指针。
    ①函数名可自动转换成指针,将函数名赋给指向函数的指针。
    ②可用指针名替代函数名调用函数。
    ③不可定义函数类型形参,可定义函数指针形参,形参为函数类型时转换为指针类型。

  2. 函数指针返回,不能返回一个函数,但能返回指向函数的指针,与函数类型的形参不一样,返回类型不能自动转换成指针,必须显式地将返回类型指定为指针。
    ①给函数指针赋值时,函数名可转换成指针类型赋给函数指针。
    ②函数指针作形参时,函数名可转换成指针类型以实参调用。
    ③函数指针作返回值时,函数名不可转换成指针类型返回。

  3. 函数指针形参,Func和Func2是函数类型,但函数名可转换成指针类型,Func/Func2/FuncP/FuncP2可表示指向同一个函数的指针。

    bool lengthCompare(const string&, const string&); //比较两个string对象的长度
    typedef  bool Func(const string&, const string&);
    等价于typedef  decltype (lengthCompare)  Func2; Func和Func2是函数类型。
    typedef  bool (*FuncP) (const string&, const string&);
    等价于typedef  decltype (lengthCompare)  *FuncP2; FuncP和FuncP2是指针类型。
    

其他

  1. inline内联函数可避免函数调用的开销。

  2. 内联函数与constexpr函数定义在头文件中,可被多次定义。

  3. 调试帮助

__func__ 编绎器定义的函数名字
__FILE__ 预处理器定义存放文件名的字符串字面值
__LINE__ 预处理器定义存放当前行号的整型字面值
__TIME__ 预处理器定义存放文件编绎时间的字符串字面值
__DATE__ 预处理器定义存放文件编绎日期的字符串字面值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值