C++primer笔记————第六章

函数
  1. 函数的定义也可以被称为声明的一种。
  2. 数组类型不能作为函数的返回值返回,但是类类型和容器类型可以被作为返回值返回
  3. C++是一种强类型语言,每个函数调用的实参在编译期间都要经过类型检查。
  4. 编译器必须根据函数参数表,对函数调用的实参执行类型检查,这就是函数必须先声明再使用的原因
  5. 所有的函数都是使用在程序运行栈中分配的存储区。该存储区与该函数相关联,知道函数结束为止,存储区将会
    由系统自动释放以便重新使用,该函数的整个存储区被称为活动记录(activation record)
  6. 参数的存储长度由它的类型来决定。
  7. 参数传递是指用函数调用的实参值来初始化函数参数存储区的过程。
  8. C++参数传递的默认初始化方法为吧实参的值拷贝到参数的存储区中,这个过程又被称为按值传递(传值)
  9. 按值传递时,函数不会访问当前调用的实参,函数处理的值是它本地的拷贝,这些拷贝都被存储在运行栈中,因此改变这些值不会影响到实参的值。
  10. 大型的类对象在作为参数传递时,分配对象并拷贝到栈中的时间和空间开销往往过大。解决方法是传指针或者传引用
  11. 把参数声明成为引用,实际上改变了默认的按值传递参数的传递机制。当参数是引用时,函数接收的是实参的左值而不是值的拷贝,这意味着函数知道实参在内存中的位置,因此能够改变它的值或者取它的地址。
  12. 使用引用作为参数的三个场景:
    1. 必须将一个参数改变成指针来允许改变实参的值的时候
    2. 向主调函数返回额外的结果
    3. 向函数传递大型类对象
  13. 如果想要在使用引用的时候不改变所引用的对象,可以使用把参数声明为const引用
  14. 函数在确定指针实际指向一个有效的对象之前不能安全的解引用一个指针。
  15. 如果一个参数可能在函数中指向不同的对象,或者这个参数可能不指向任何对象,那么必须使用指针参数。
  16. 参数为const时,并不要求实参也一定为const
  17. 在C++中,数组永远不会按值传递,它是传递第0个元素的指针。如果不希望改变数组元素时,可以将参数类型声明为const
  18. 数组长度不是参数类型的一部分
  19. 如果想要让编译器检查数组参数的长度,可以将参数声明为数组的引用。
  20. 容器类型实际上是类类型。
  21. 函数调用的实参按位置解析,缺省实参只能有来替换函数调用缺少的尾部实参。
  22. 一个参数只能在一个文件中被制定一次缺省实参。
  23. 习惯上,缺省实参在公共头文件包含的函数声明中制定,而不是在函数定义中。如果缺省实参在函数定义的参数表中提供,则缺省实参只能用在包含该函数定义的文本文件的函数调用中。
  24. 缺省实参不一定必须是常量表达式,可以使用任意表达式
  25. 当我们无法列出传递参数的所有实参的类型和数目的时候,可以使用省略号指定函数参数表。省略号挂起类型检查机制,它们提示编译器会有0个或多个实参。
  26. 大多数带有省略号的函数都利用显式声明的参数中的一些信息,来获取函数调用中提供的其他可选实参的类型和数目。
  27. 默认情况下,返回值是按值传递的。
  28. 在某些情况下,编译器会将按值传递的返回值转换为按引用传递,该优化被称为命名返回优值优化(named return value optimization)
  29. 为了防止对返回值的无意修改,返回值应该被声明为const
  30. 为一个小操作定义一个函数的好处:
    1. 方便阅读这样的代码,尤其是这个小操作很复杂的时候
    2. 方便修改
    3. 语义是统一的,每个测试都保证以相同的方式实现
    4. 函数可以被重用
  31. 为小操作定义一个函数的缺点:
    • 调用函数比直接计算慢的多,因为要拷贝实參,保存机器的寄存器,程序还必须转向一个新位置。
  32. 如果一个函数被指定为内联函数,那么它在程序的每个调用点上都会被展开
  33. 编译器可以忽略inline指令
  34. 程序员用链接指示符extern告诉编译器程序是用其他语言编写的。
  35. extern “C” 表示用C语言编写的。
  36. extern “C”后面跟的花括号中的函数名对外是可见的。
  37. 若链接指示符后的花括号中含有#include,在头文件中的函数声明都被假定是用链接指示符的程序设计语言所写的。
  38. 链接指示符不能出现在函数体中
  39. 一般来讲,链接指示符放在头文件中更为合适。
  40. 命令行选项是main()函数的实參,在main()函数里,我们可以通过一个名为argv的C风格字符串数组访问它。
  41. int main(int argc, char* argv) argc 包含了命令行选项的个数,argv包含了argc个C风格字符串
  42. 省略号是函数类型的一部分
  43. 当一个函数名没有被调用操作符修饰时,会被解释成指向该类型函数的指针
  44. 将取地址操作符作用在函数名上也可以产生指向该函数类型的作用。
  45. 只有当赋值操作符左边指针的参数表和返回类型与右边函数或指针的参数表和返回类型完全匹配时,初始化或赋值才是正确的。
  46. 指向函数类型的指针之间不存在隐式类型转换
  47. 函数指针可以用0初始化或者赋值,表示该指针不指向任何函数。
  48. 函数指针在调用函数时,不需要解引用操作符
  49. 当链接指示符应用在一个声明上时,所有被它声明的函数都将受到链接指示符的影响
文章目录
  1. 1. 函数
,