C++ primer 学习笔记(第六章)

纯粹笔记向,只记录一些我觉得比较坑或者需要注意或者值的思考的地方。

  • 6.2.2 传引用参数

1.使用引用避免拷贝

这个还是比较常见的,如在vector,string以及较大的类或者结构体的拷贝中是十分低效的。最好使用引用。

  • 6.2.3 const形参和实参

1.首先介绍两个概念,顶层const是指指针本身是一个常量,底层const代表指针所指的对象是一个常量。实参初始化的过程中会忽略掉顶层const,所以当形参有顶层const时,传给它常量对象或者非常量对象都是可以的。而这就意味着如下的两句代码是编译不过去的(因为在编译的时候他们被视为形参列表相同):

  • 6.2.6 含有可变形参的函数

1.C++11提供了一种方法解决所有实参类型相同,但个数不定的情况的方法:传递一个类型为initializer_list的标准库类型的形参。它定义在同名的头文件中,其实相当于一种特定类型的值的数组。另外initializer_list对象中的元素永远是常量值。并且用花括号列表初始化该类型的对象。

2.省略符形参

只能出现在形参列表的最后一个位置,省略符省略的部分无需类型检查。

  • 6.3.2 引用返回左值

调用一个返回引用的函数得到的是左值,其余的返回类型为右值。所以下面的代码完全是合法的。只要返回类型为非常量引用我们便可以为函数结果赋值。(感觉有点好玩啊)

  • 6.3.3 返回数组指针

这里主要写一下尾置返回类型(C++11)和使用decltype来解决这个问题。因为这两种是在学C的时候没有碰到的。

1.使用尾置返回类型

这种形式主要用于返回类型比较复杂的函数,如数组的指针或者数组的引用。  尾置返回类型跟在形参列表后并以->开头。为了表示函数真正的返回类型在形参列表之后,我们在本应出现返回类型的地方写上一个auto。

2.当然如果我们知道函数返回的指针将指向哪个数组,就可以用decltype来声明返回类型。但是这样decltype的结果仍然是一个数组,所以要返回指针的话还需要在后面加上一个*,来代表指针。

比如这样:

  • 6.5.2内联函数和constexpr函数

constexpr函数是指能用于常量表达式的函数。但它的返回类型和 所有形参类型都必须是字面值类型,并且有且只有一条return语句,编译器会把对它的调用结果替换成结果值。当然其实这个函数也是可以返回非常量的结果的,但是那样就不能用在常量表达式的上下文。另外constexpr函数被隐式的指定为内联函数。

  • 6.5.3调试帮助

1.assert预处理宏

assert宏使用一个表达式作为它的条件:

首先对expr求值,如果为真assert什么都不做,如果为假,assert输出信息并终止程序的执行。

2.NDEBUG预处理变量

assert的行为依赖于一个名为NDEBUG的预处理变量的状态,如果这个变量定义了:#define NDEBUG,从而关闭调试状态,assert什么都不做,反之assert将执行运行时检查。

当然如果未定义NDEBUG,也会将执行#ifndef和#endif之间的代码的,反之不会执行。

  • 6.7 函数指针

函数指针指向的类型由返回类型和形参类型共同决定。当我们把函数名作为一个值使用时,函数自动转化为指针。如:

此外,我们可以通过直接使用指向函数的指针来调用该函数,而无需提前解引用指针。

另外也可以通过decltype以及尾置返回的方式来返回一个函数指针,这样可能更方便一些。也更易于阅读吧。

 

第六章初步读完。

发表评论

电子邮件地址不会被公开。 必填项已用*标注