c++Primer读书笔记(第六章 函数)

it2026-08-14  9

6.1函数基础

调用函数

主调函数的执行被暂时中断,被调函数开始执行。

6.2参数传递

引用传递:可以通过形参改变实参的值 值传递:拷贝

使用引用来避免拷贝:拷贝大的类类型对象或者容器对象比较低效,甚至有的类类型根本不支持拷贝操作。可以使用引用形参来访问类型的对象。

注意:如果函数无需改变引用形参的值,最好将其声明为常量引用。

使用引用形参范围额外的信息

6.2.3 const形参和实参

尽量使用常量引用: 1.可以阻止改变修改实参的值 2.让实参可以接受const对象、字面值或者需要类型转换的对象

错误例子 如果一个函数上的形参类型是常量引用,而函数中又包含了一个另一个函数b,b的形参类型是普通引用,这时候编译器就会报错。 解决:修改函数b的形参,如果实在不能改变,那就在函数a内部定义一个string类型的变量作为副本。

6.2.4数组形参

数组传参由于不能拷贝数组,通常会转换为指针。 确保数组不会越界:传递数首地址和尾地址;传递首地址和大小

6.3.2有返回值函数

返回的值用于初始化调用点的一个临时变量。

注意不要返回局部对象的引用或指针

6.4函数重载

函数名字相同但是形参列表不同称之为重载(overload)函数。 在形参数量或者形参类型上有所不同。

重载和const形参

无法区分顶层const 可以区分底层const

调用重载的函数

重载函数有三种结果: 1.找到最佳匹配函数 2.找不到,编译器发出无匹配的错误信息 3.二义性调用

6.4.1重载与作用域

在不同的作用域中无法重载函数名 内部的重载函数将会覆盖外部作用域的重载函数

6.5特殊用途语言特性

6.5.1 默认实参

为每一个形参都提供了默认实参 当一个形参被赋予了默认值之后,所有的形参都必须要有默认值

6.5.2内联函数和constexpr函数

内联和constexper都放在头文件里

把规模较小的操作定义成函数有很多好处:

阅读函数调用要比阅读等价的条件表达式更直观确保行为的统一,每次调用都是相同的修改方便重复利用

缺点: 每次都需要进行函数调用:先保存寄存器,并在返回时恢复;

内联函数可以避免函数调用的开销:

内联说明只是向编译器发出一个请求,编译器可以忽略。 用于优化规模较小、流程直接、频繁调用的函数

constexper函数

函数的返回类型以及所有的形参类型都是字面值类型,而且函数体中必须有且只有一条return语句

6.5.3调试帮助

assert预处理宏 首先对expr求值,如果为假,assert输出信息并且终止程序的执行。如果表达式为真,assert什么也不做。

assert(expr);

NDEBUG预处理变量

如果定义了NDEBUG,那么assert什么也不做。

6.6 函数匹配

函数匹配步骤:

选定候选函数(同名、声明可见)从候选函数中选定可行函数(形参数量相等、实参类型和形参类型匹配或者可以转换)

如果函数含有默认实参,那么我们在调用该函数时传入的实参数量可以少于实际使用的实参数量

返回指向函数的指针 直接返回指向函数的指针:f有形参列表是一个函数,带*返回的是指针;指针本身也包含形参列表,指针指向函数

int (*f(int))(int *,int); auto f(int)->int(*)(int*,int);

等价于

using F=int(int*,int) using F_ptr=int(*)(int*,int) F *f(int); F_ptr f(int);
最新回复(0)