第六章 函数(下)
-
在含有return语句的循环后面应该也有一条return语句
-
不要返回局部对象的引用或指针,当函数结束时临时对象占用的空间也就随之释放掉了,所以两条return语句都指向了不再可用的内存空间。
-
如果函数返回指针、引用或类的对象,我们就能使用函数调用的结果访问结果对象的成员。
-
我们能为返回类型是非常量引用的函数的结果赋值
-
C++11新标准规定,函数可以返回花括号包围的值的列表
-
如果函数返回的是内置类型,则花括号包围的列表最多包含一个值
-
如果控制到达了main 函数的结尾处而且没有return语句,编译器将隐式地插入一条返回0的return语句
-
因为数组不能被拷贝,所以函数不能返回数组。
-
我们把函数的返回类型放在了形参列表之后,所以可以清楚地看到func函数返回的是一个指针,并目该指针指向了含有10个数的数组。
auto func(int i) -> int(*)[10]
-
不允许两个函数除了返回类型外其他所有的要素都相同。
-
一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来;另一方面,如果形参是某种类型的指针或引用,则通过区分其指向的是常量对象还是非常量对象可以实现函数重载,此时的const是底层的
-
重载对作用域的一般性质并没有什么改变:如果我们在内层作用域中声明名字,它将隐藏外层作用域中声明的同名实体。在不同的作用域中无法重载函数名
-
一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值。
-
尽量让不怎么使用默认值的形参出现在前面,而让那些经常使用默认值的形参出现在后面。
-
局部变量不能作为默认实参。除此之外,只要表达式的类型能转换成形参所需的类型,该表达式就能作为默认实参
-
一般来说,内联机制用于优化规模较小、流程直接、频繁调用的函数
-
constexpr函数的返回类型及所有形参的类型都得是字面值类型,而且函数体中必须有且只有一条return语句
-
和其他函数不一样,内联函数和constexpr函数可以在程序中多次定义(头文件)
-
当应用程序编写完成准备发布时,要先屏蔽掉调试代码。这种方法用到两项预处理功能:assert和NDEBUG。
-
assert是一种预处理宏(preprocessor marco) 首先对 expr 求值,如果表达式为假(即0),assert输出信息并终止程序的执行。如果表达式为真(即非0),assert什么也不做。
-
assert 宏定义在cassert头文件中。如我们所知,预处理名字由预处理器而非编译器管理
-
assert的行为依赖于一个名为NDEBUG的预处理变量的状态。如果定义了NDEBUG,则assert什么也不做。默认状态下没有定义NDEBUG,此时 assert 将执行运行时检查。
-
我们使用变量输出当前调试的函数的名字。编译器为每个函func数都定义了__func__,它是const char 的一个静态数组,用于存放函数的名字
-
我们无法把 const 对象、字面值常量或者需要进行类型转换的对象传递给普通的引用形参
-
当我们想把数组作为函数的形参时,有三种可供选择的方式:一是声明为指针,二是声明为不限维度的数组,三是声明为维度确定的数组。实际上,因为数组传入函数时实参自动转换成指向数组首元素的指针,所以这三种方式是等价的
-
引用类型的优势主要是可以直接操作所引用的对象以及避免拷贝较为复杂的类类型对象和容器对象。因为 initializer list 对象的元素永远 是常量值,所以我们不可能通过设定引用类型来更改循环控制变量的内容。只有当initializer list对象的元素类型是类类型或容器类型(比如string)时,才有必要把范围 for 循环的循环控制变量设为引用类型。
-
如果引用所引的是函数开始之前就已经存在的对象,则返回该引用是有效的:如果引用所引的是函数的局部变量,则随着函数结束局部变量也失效了,此时返回的引用无效。
当不希望返回的对象被修改时,返回对常量的引用 -
函数指针