C++ Primer:第6章 函数


第6章 函数

6.1 函数基础

基本内容:

  1. 函数定义组成:返回类型,函数名,形参列表,函数体。
  2. 主调函数和被调函数,形参和实参,函数返回类型。
  3. 局部变量:形参和函数体内部定义的变量。自动对象:只存在于块执行期间的对象。局部静态变量:初次使用时才被初始化,即使它所在函数已执行结束,也要等到程序终止才被销毁。
  4. 函数声明(函数原型):只能定义一次,可声明多次。函数声明无需函数体,以分号结尾。
  5. 分离式编译。

备注:

  1. 函数返回类型为void,表示函数不返回任何值。函数不能返回数组或函数,但可以返回指向数组或函数的指针。
  2. 局部变量仅在函数作用域内可见,会隐藏名字(某个作用域内声明的名字会隐藏掉外层作用域中声明的同名实体)。
  3. 内置类型的局部静态变量若未显式初始化,则执行值初始化,变量初始值为0。
  4. 若函数永远不被使用,则函数可以只声明不定义。
  5. 应在头文件内声明函数,在源文件内定义函数,且源文件应包含头文件。

6.2 参数传递

基本内容:

  1. 值传递:传值参数是非引用类型,可以是指针形参。
  2. 引用传递:传引用参数。
  3. const形参和实参:实参初始化形参与其它初始化过程一样。
  4. 数组形参、数组引用形参,传递多维数组。
  5. main:处理命令行选项。
  6. 可变形参的函数,省略符形参。

备注:

  1. 指针传递也算是值传递,指针实参与指针形参是两个指向同一对象的不同指针。修改指针形参不会改变指针实参,修改指针形参所指对象,指针实参不会改变,但其所指对象会相应改变。
  2. 引用传递可修改实参,避免对过大对象的拷贝,可返回额外信息。建议用引用形参代替指针形参。
  3. 普通引用和普通指针的形参只能使用类型匹配的实参;绑定常量的引用形参可以接受任何能转换的表达式。
  4. 尽量使用绑定常量的引用,避免造成实参可修改的误导,同时扩大函数所能接受的实参范围。
  5. 传递数组的3种方法:数组本身包含结束标记;传递指向数组首元素和尾后元素的指针;定义表示数组大小的形参。
  6. argv[0]保存程序名字,真正用户输入的参数从argv[1]开始。
  7. 传递可变形参的2种方法:传递initializer_list形参;使用可变参数模板。
  8. initializer_list对象中的元素永远是常量值,无法修改。

6.3 返回类型和return语句

基本内容:

  1. 无返回值函数,有返回值函数。
  2. 返回数组指针。

备注:

  1. 若循环中含有return语句,则循环之后也应有return语句。
  2. 函数返回引用,其实是返回所引对象的一个别名。
  3. 不要返回局部对象的引用或指针。因为函数结束后,局部变量和指针所占空间已被释放,不再指向有效的内存区域。
  4. 调用一个返回引用的函数得到左值,其它返回类型得到右值。
  5. 函数可返回花括号包括的值列表。
  6. 递归函数即直接或间接调用它自身的函数。递归函数必须有某条路径不包含递归调用,即一定要有递归终止条件,否则会出现递归循环。main函数不能调用自身。
  7. 函数返回数组指针的方法:直接返回数组指针;类型别名;decltype声明返回类型;尾置返回类型。

6.4 函数重载

基本内容:

  1. 重载函数:同一作用域内,函数名相同,形参列表不同。

备注:

  1. main函数不能递归,也不能重载。
  2. 重载函数只是形参数量或形参类型不同,不考虑返回类型,不看形参名字,忽略顶层const,区分底层const。
  3. 调用重载函数的3种可能结果:最佳匹配;无匹配;二义性调用。
  4. 不要将函数声明置于局部作用域中,因为它会隐藏外层作用域的同名实体。

6.5 特殊用途语言特性

基本内容:

  1. 默认实参,内联函数,constexpr函数。
  2. assert预处理宏,NDEBUG预处理变量。

备注:

  1. 某一形参有默认值,其后所有形参也必须有默认值;设计默认实参函数时,常修改的形参放在前面,不常修改的形参放后面;函数可多次声明,但在给定的作用域中,只能被赋予一次默认实参;除局部变量外,一般类型匹配的表达式都可作默认实参。
  2. 内联函数需在返回类型前加inline,可避免函数调用的开销。
  3. constexpr函数要求返回类型和形参类型都是字面值类型(整数和浮点数),有且只有一条return语句。constexpr函数被隐式指定为内联函数。constexpr函数的形参和返回值不一定是常量表达式。
  4. 内联函数和constexpr函数通常在头文件中定义,可多次定义,但定义必须完全一致。
  5. 若expr为真,assert什么都不做;若为假,assert输出信息并终止程序的执行。assert宏常用于检查“不能发生”的条件。
  6. 预处理变量和宏名字在程序内必须唯一。
  7. 定义NDEBUG可避免检查各种条件所需的运行时开销,相当于不进行运行时检查。

6.6 函数匹配

基本内容:

  1. 候选函数,可行函数。
  2. 最佳匹配,无匹配,二义性调用。
  3. 实参类型转换。

备注:

  1. 候选函数与被调用函数同名;其声明在调用点可见。
  2. 可行函数形参数量与实参数量相等,形参与实参类型相同或实参可转换为形参类型。
  3. 最佳匹配即形参与实参类型最匹配的可行函数,无匹配函数即未找到可行函数,二义性调用即可行函数中无最佳匹配。
  4. 最佳匹配等级:精确匹配(类型相同,数组或函数转指针,增删顶层const)>const转换>类型提升>算术类型转换>类类型转换。

6.7 函数指针

基本内容:

  1. 函数指针即指向函数的指针。

备注:

  1. 函数指针赋值时取地址符是可选的。
  2. 函数指针初始化或赋值时要求形参类型和返回类型严格匹配,不存在函数指针间转换。
  3. 函数作为值时,会自动转换成指针使用。但返回类型不会自动将函数转换成指针,必须显示将返回类型指定为指针。
  4. 以函数指针作为形参或返回值,一般使用类型别名,decltype。若是返回值,还可使用尾置返回类型。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容

  • #1.函数基础1.1 局部对象1.2 函数声明1.3 分离式编译 #2.参数传递2.1 传值参数2.2 传引用参数...
    MrDecoder阅读 595评论 0 1
  • 3. 类设计者工具 3.1 拷贝控制 五种函数拷贝构造函数拷贝赋值运算符移动构造函数移动赋值运算符析构函数拷贝和移...
    王侦阅读 1,804评论 0 1
  • 大多数类型都能用作函数的返回类型,一种特殊的返回类型是void,它表示函数不返回任何值。函数的返回类型不能是数组类...
    梦中睡觉的巴子阅读 272评论 0 0
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,183评论 0 3
  • 一些情况下函数有个别形参不会被用到,此类形参通常不命名以表示在函数体内不会使用它。但是即便是这样,调用此函数的时候...
    修司敦阅读 328评论 0 0