前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ Primer ---函数(读书笔记)

C++ Primer ---函数(读书笔记)

作者头像
HeaiKun
发布2020-07-07 11:35:39
6000
发布2020-07-07 11:35:39
举报
文章被收录于专栏:HeaiKunHeaiKun

函数基础

一个函数是由 返回类型 函数名称 0个或多个形参以及函数体构成。 函数调用时 使用函数名称加小括号,小括号里面是实参。 函数调用时,完成部分的工作:

  1. 使用实参进行初始化函数对应的形参
  2. 将控制权交给被调用的函数

当函数遇到return 时 函数返回,函数返回时完成两个部分的工作:

  1. 将return 后面的值返回(如果有的话)
  2. 将控制权由被调用函数交给主调函数

形参和实参

实参是形参的初始值,要和形参一一对应,如果没有形参可以使用void来表示。

形参和函数体内部定义的变量 统称为局部变量。

形参是一种自动对象,只在函数体内部生效。

如果局部变量定义本身有初始值,就用该初始值进行初始化,否则就是默认初始化,有可能产生未定义的垃圾值。

局部静态对象当局部对象使用 static 修饰时,就是局部静态对象。局部静态对象只有在第一次执行定义的时候进行初始化。如果没有显式的初始化则默认初始化为0,局部静态队形的生命周期是整个程序结束,当所在函数执行完毕时,局部静态对象仍然有效。

函数的声明

函数和对象一样,需要先声明在使用。函数只能定义一次,但是可以声明多次。只有函数永远不会被调用时才可以只有声明没有定义。 声明和定义的区别是 声明没有函数体,定义有函数体。 函数的声明和定义应该分离,声明放到头文件中,定义放到源文件中,要注意的是 函数声明的头文件应该被包含在定义函数的源文件中。

参数传递

传值参数将初始值拷贝给变量,这是对变量的改变,不会影响初始值。如果传递的是指针,拷贝指针的值给形参对象,两个指针对象不同,但都指向同一个地址。

传引用参数传引用参数时,形参只是实参的一个别名,不会产生拷贝操作,实际上是一个对象。形参不会创建新的对象。 当形参是数组时,编译器会将数组转换成对应的指针类型,当函数传递一个数组时,实际上传递的是指向数组首元素的指针。要注意的是 要保证数组使用时 不要越界。

含有可变形参的函数 可以使用 initializer_listlst 来作为形参,可以实现可变数量参数的情况。 也可以使用省略符形参,省略符形参只能适用于C/C++ 通用类型,大多数类类型的对象在传递给省略符形参时都无法正确拷贝。

返回类型和return语句

无返回值的return 只能用在返回类型void 的函数中,这样的函数不强制要求有return语句,在函数末尾有隐式的return。 返回一个值的方式和初始化一个变量或者形参的方式是一样的,返回值用于初始化调用点的一个临时值,该临时值就是函数调用的的结果。 返回的结果 拷贝复制到接收函数返回值的变量中。 局部变量随着函数的结束,而被释放,因此 不要返回 局部变量的引用或者指针。

函数重载

在同一个作用域中,几个函数的名字相同但是形参不同,我们称之为重载函数。 编译器会根据传递的实参类型去推断要调用的是哪一个函数。注意 main函数不能重载。 只有在形参数量和形参类型不同时才能正常重载。 要注意const类型和非const类型在重载的时候要注意,只有底层const才能正常区别,顶层const无法无别。

特殊用途语言特性

  • 默认实参
  • 内联函数
  • constexpr函数

默认实参: 定义的时候将形参赋值 int func(int a=1, int b=2, int c=3 ); 调用的时候: func(); ---------等价 func(1, 2, 3); func(4); ---------等价 func(4, 2, 3); func(3.6); ---------等价 func(3, 6, 3); 只能省略尾部实参。 局部变量不能作为实参。

内联函数 内联函数可以避免函数调用的开销 内联机制用于优化规模较小,流程直接,调用频繁的函数。

constexpr 函数 定义constexpr函数和其他函数类似,要注意:函数的返回类型及所有的形参类型都得是字面值类型。而且函数体重只能有且只有一条return语句。 constexpr 函数不一定返回常量表达式。 内联函数和constexpr 函数放在头文件内。

调试

assert 预处理宏 assert(expr) 先对expr求值,如果表达式为假(为0),assert 输出信息并终止程序的执行,如果表达式为真(非零),assert 什么也不做。 assert 依赖 NDEBUG宏,如果 定义了NDEBUG宏,assert 什么都不做。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HeaiKun 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 函数基础
  • 参数传递
  • 返回类型和return语句
  • 函数重载
  • 特殊用途语言特性
  • 调试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档