《C++ Primer》 读书笔记——第六章 函数

第六章 函数

6.1 函数基础

1、在函数体中,一旦遇到return语句就交还控制流给调用方

这意味着,在for循环或者while循环中,当遇到return时就直接退出,不再继续执行循环。

2、函数返回类型不能是数组

3、局部变量初始化

如果在定义变量时没有给定初始值,则变量会执行默认初始化。而默认初始化有两种情况:
如果变量是内置类型(int、char、float),则该变量的值是未定义的。使用这些未定义的变量将会引发错误。
如果变量是用户自定义类,则会执行类的默认构造函数。

建议在定义内置类型的变量时,尽量给它们赋一个初值。

4、局部静态变量的使用

局部静态变量在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁。

5、使用void显式声明空的形参列表

在这里插入图片描述

6、分离式编译

头文件中尖括号和双括号的区别

尖括号和双括号搜索头文件的顺序不同:

  • <>表示从系统目下开始搜索,然后再搜索PATH环境变量所列出的目录,不搜索当前目录
  • “”表示先从当前目录搜索,然后是系统目录和PATH环境变量所列出的目录。

如果我们知道头文件在系统目录或者环境变量目录下时,可以用<>来加快搜索速度

从源代码到可执行文件的流程

在这里插入图片描述

预编译(编译预处理)

一般处理宏定义之类的工作
①、将宏定义指令进行替换:如 # define Name TokenString. 将Name替换成TokenString
②、条件编译指令:# ifdef,# ifndef,# else,# elif,# endif依据条件看是否执行
③、头文件包含指令:将cpp文件中说明的头文件加入到cpp文件中
④、特殊符号处理
预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。

编译

编译程序所要做的工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。

汇编

汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程
生成独立的单个目标文件

链接

将所有目标文件都链接起来。

编译部分的参考文章


6.2 参数传递

1、使用引用避免拷贝

拷贝大的类型对象或者容器对象比较低效,甚至有的类(IO)根本就不支持拷贝操作。这时候可以通过引用传参的方式来传递参数。

比如:当函数的参数是string的时候,因为string的对象可能会非常长,所以应该尽量避免直接拷贝它们。而这时候使用引用形参是比较明智的选择。

如果不想因为引用而改变实参的值,则可以使用常量的引用作为函数参数。

2、使用引用形参返回额外信息

当想要一个函数返回多个值时,可以将其中一部分值通过引用的形式传递进去,在函数内把相应的返回值赋给引用形参。
在这里插入图片描述
本例中,既能通过返回值得到ret,又能通过引用的性质修改occurs对应的实参。

3、数组引用实参

在这里插入图片描述

4、main函数的参数

main(int argc, char *argv[])
argc: 记录数组中字符串的个数
argv: 字符二维数组,也就是字符串数组
在这里插入图片描述在这里插入图片描述

5、省略符形参

在这里插入图片描述


6.3 返回类型和return语句

1、循环中的return语句,在循环结束后必须再跟着一个return语句
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
该错误很多编译器都无法发现,需要多加注意

2、不要返回局部对象的引用或指针

函数完成后,局部对象所占用的存储空间也就随之被释放掉。因此,函数终止意味着局部变量的引用将指向不再有效的内存区域。

3、列表初始化的返回值

在这里插入图片描述
在这里插入图片描述

4、main函数的返回值

如果控制到达了main函数的结尾处而且没有return语句,编译器将隐式地插入一条返回0的return语句


6.4 函数重载

1、重载与const的关系

  • 重载无法区分顶层const
  • 重载可以区分其它非顶层const
    在这里插入图片描述
    在这里插入图片描述

对于含有const和指针,或者const和引用的变量来说:

  • 可以通过指针或者引用修改原值的是顶层const
  • 不可以通过指针或者引用修改原值的是底层const

对于只含有const的变量来说,它们全是顶层const


6.5 特殊用途语言特性

1、默认实参

让不使用默认值的实参出现在前面,使用默认值的实参出现在后面。

2、constexpr函数、内联函数

在这里插入图片描述
constexpr函数将被隐式地指定为内联函数,这样可以提高效率

3、assert断言

在这里插入图片描述

  • 如果断言里面的布尔值为0,则将会终止程序的执行。
  • 需要包含头文件cassert

猜你喜欢

转载自blog.csdn.net/youyadefeng1/article/details/113396561
今日推荐