第8章 函数探幽

1. 对于内联函数,编译器将使用相应的函数代码替换函数调用,程序无需跳到一个位置执行代码,再调回来。因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存。

2. 要使用内联函数,需要在:

函数声明前加上关键字inline;

函数定义前加上关键字inline;

3. 程序员请求将函数作为内联函数时,编译器不一定会满足这种需求。它可能认为该函数过大或注意到函数调用了自己(内联函数不能递归)。

4. 必须在声明引用变量时进行初始化

int rat = 101;

int & rodents = rats;

C语言只能按值传递,按引用传递是C++新增的特性。

  1. 5.  如果程序员的意图是让函数使用传递给它的信息,而不对这些信息进行修改,同时又想使用引用,则应使用常量引用。

double refcube(const double &ra);

6. 当函数参数为常量引用时,什么时候创建临时变量呢?

有两种情况:

实参的类型正确,但不是左值;

实参的类型不正确,但可以转换为正确的类型。

double refcube(const double &ra)

{

return ra * ra * ra;

}

long edge = 5L;

double c5 = refcube(edge);

double c6 = refcube(7.0);

在上述两种情况下,编译器将生成一个临时匿名变量,并让ra指向它。这些临时变量只在函数调用期间存在,此后编译器便可以随意将其删除。

7. 对于形参为cosnt引用的C++函数,如果实参类型不匹配,则其行为类似于按值传递,为确保原始数据不被修改,将使用临时变量,该函数调用的参数的值传递给该匿名临时变量,并让参数来引用该变量。

8. 如果函数参数不是常量引用,而是普通引用,则实参不能是左值,而且必须类型严格匹配,否则编译出错。

double refcube(double &ra)

{

return ra * ra * ra;

}

double x = 3.0;

cout << refcube(x + 2.0);//错误,此时实参不能是左值

long a = 3;

cout << refcube(a);//错误,此时实参类型和形参不匹配

如果参数改成const double &ra则能够成功编译。为什么呢?P263

如果double refcube(double &ra)函数的意图是修改该变量ra,则创建临时变量将阻止该意图的实现,解决办法是禁止创建临时变量,现在的C++标准正是这么做的。而double refcube(const double &ra)

该函数的目的只是使用传递的值,而不是修改它们,因此临时变量不会造成任何不利的影响,反而会使函数在可处理的参数种类方面更加通用。

9. 将引用参数声明为常量数据的引用的理由有三个:

使用const可以避免无意中修改数据的编程错误;

使用const使函数能够处理const和非const实参,否则只能接受非const数据;

使用const引用使函数能够正确生成并使用临时变量,使函数能处理更多的参数种类。

10. 引入引用的目的是用于结构和类,而不是基本的数据类型。

11. P268为何将const用于引用返回类型

如果函数的返回类型为类型引用,则可以用作左值。这是因为赋值语句左边表达式必须返回一个可修改的内存块,而函数返回引用确实标识的是这样的一个内存块。

Accumulate(dup, five)= four;

而常规返回类型是右值。因为这样的返回值位于临时内存单元中,运行到下一条语句,它们可能不再存在。

假设您要使用引用返回值,但又不允许执行像给accumulate()赋值这样的操作,只需将返回类型声明为const引用。

12. 继承的另一个特征是,基类引用可以指向派生类对象,而无需进行强制类型转换。

13. ostream是基类,ofstream是派生类

14. 对于带参数列表的函数,必须从右向左添加默认值。也就是说,也为某个参数设置默认值,则必须为它右边所有的参数提供默认值。

int harpo(int n, int m = 4, int j = 5);

实参必须从左到右依次赋给相应的形参,而不能跳过任何参数。

Beeps = harpo(3, , 8);是不允许的。

15. 函数重载也称为函数多态。函数重载的关键是函数的参数列表(即函数特征标)。编译器在检查函数特征标时,将把类型引用和类型本身视为同一个特征标。

16. C++如何跟踪每一个重载的函数呢?它根据函数原型中指定的形参类型对每个函数名进行名次修饰(name decoration)。

17. 在C++98添加关键字typename之前,C++使用关键字class来创建模板。

18. P285~P288显示具体化。

对于给定的函数名,可以有非模板函数、模板函数、显式具体化目标函数以及它们的重载版本。

显式具体化的原型和定义应以template<>打头,并通过名次来指出类型。

具体化优先于常规模板,而非模板函数优先于具体化和常规模板。

19. 为进一步了解模板,必须理解术语实例化和具体化P288。

20. 在代码中包含函数模板本身并不会生成函数定义,他只是一个用于生成函数定义的方案。

21. template <typename T>

void Swap(T &a, T &b)

{

T temp;

temp = a;

a = b;

b = temp;

}

int i = 10, j = 20;

隐式实例化 swap(i, j)

显示实例化template void swap<int>(int &, int &);直接命令编译器创建特定的实例,将使用swap模板生成一个使用int类型的实例。

显式具体化使用下面两个等价的声明之一:

template <> void swap<int>(int &, int &);

template <> void swap(int &, int &);

该显式具体化的意思是”不要使用swap()模板来生成函数定义,而应使用专门为int类型显式地定义的函数定义”。这两个原型必须有自己的函数定义。

显式具体化声明在template后包含<>,而显式实例化没有。

22. 隐式实例化、显式实例化和显式具体化统称为具体化。

23. 8.5.6模板函数的发展P295-P297

C++ 11关键字decltype

后置返回类型(trailing return type)

C++ primer plus读书笔记——第8章 函数探幽的更多相关文章

  1. C++ primer plus读书笔记——第7章 函数——C++的编程模块

    第7章 函数--C++的编程模块 1. 函数的返回类型不能是数组,但可以是其他任何一种类型,甚至可以是结构和对象.有趣的是,C++函数不能直接返回数组,但可以将数组作为结构或对象的组成部分来返回. 2 ...

  2. 《C++ Primer Plus 6th》读书笔记 - 第8章 函数探幽

    1. 摘录 默认参数指的是当函数调用中省略了实参时自动使用的一个值. 默认参数并非编程方面的重大突破,而只是提供了一种便捷的方式.使用默认参数,可以减少要定义的析构函数.方法以及方法重载的数量. 试图 ...

  3. C++ Primer Plus读书笔记(八)函数探幽

    1.内联函数 inline int square(x) {return x*x} 2.引用变量 int& 中的& 不是地址运算符,就想定义指针时的char* 一样,int&指的 ...

  4. C primer plus 读书笔记第十一章

    本章标题是字符串和字符串函数.主要是了解和字符串有关的函数. 1.字符串表示和字符串I/O 主要内容:字符串常量和字符串数组的初始化,对比了指针和字符串. 其中要注意的是,数组初始化是从静态存储区把一 ...

  5. C primer plus 读书笔记第六章和第七章

    这两章的标题是C控制语句:循环以及C控制语句:分支和跳转.之所以一起讲,是因为这两章内容都是讲控制语句. 第六章的第一段示例代码 /* summing.c --对用户输入的整数求和 */ #inclu ...

  6. C primer plus 读书笔记第五章

    本章的标题是运算符,表达式和语句.主要研究如何处理数据. 示例代码展示了一个使用简单的while循环的代码,难度不大. 下面简单介绍本章的基本概念. 1.基本运算符. 基本运算符有:赋值运算符(C语言 ...

  7. C primer plus 读书笔记第四章

    本章的标题是字符串的格式化输入/输出,重点介绍输入和输出. 本章的第一段示例代码和上一张示例代码很相近,代码就不贴了,新出现的特性是使用了一个数组来存放字符串,C预处理命令和strlen()函数. 下 ...

  8. C primer plus 读书笔记第三章

    本章的标题是数据和C,主要内容是介绍数据类型中的整数类型和浮点数类型. 本章的第一段代码 #include <stdio.h> int main(void) { float weight; ...

  9. C++ primer plus读书笔记——第17章 输入、输出和文件

    第17章 输入.输出和文件 1. 对键盘进行输入缓冲可以让用户在将输入传输给程序之前返回并更正.C++程序通常在用户按下回车键时刷新输入缓冲区. 2. 一些I/O类 streambuf类为缓冲区提供了 ...

随机推荐

  1. 技术分享PPT整理(一):Bootstrap基础与应用

    最近在复习的时候总感觉有些知识点总结过,但是翻了一下博客没有找到,才想起来有一些内容是放在部门的技术分享里的,趁这个时候跳了几篇相对有价值的梳理一下,因为都是PPT,所以内容相对零散,以要点和图片为主 ...

  2. 你说,怎么把Bean塞到Spring容器?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 小傅哥,你是怎么学习的? 有很多初学编程或者码了几年CRUD砖的小伙伴问我,该怎么学 ...

  3. 常见SQL命令总结学习 -- <1>

    SQL学习网练习记录 参考1:http://sample.jimstone.com.cn/xsql/Course/4.html 参考2:http://sample.jimstone.com.cn/xs ...

  4. [Fundamental of Power Electronics]-PART I-6.变换器电路-6.1 电路演化

    6.1 电路演化 第一章使用基本原理构建了buck变换器(图6.1).开关可以降低电压直流分量,低通滤波器可消除开关纹波.在CCM下,buck变换器的变换比为\(M=D\).buck变换器是最简单的, ...

  5. 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理

    状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实 ...

  6. Warm_up(HCTF_2018)

    Warm up 考察知识点: 文件包含漏洞 代码审计 解题步骤 首先我们进来看到了一个滑稽的表情,没啥别的东西,先看看源码 源码中发现有注释 source.php 我们访问source.php,得到代 ...

  7. [翻译]正式宣布 Visual Studio 2022

    原文: [Visual Studio 2022] 首先,我们要感谢正在阅读这篇文章的你,我们所有的产品开发都始于你也止于你,无论你是在开发者社区上发帖,还是填写了调查问卷,还是向我们发送了反馈意见,或 ...

  8. Linux下屏幕亮度的调节

    1 概述 Linux下的屏幕调节可以通过图形界面或者命令行进行调节,图形界面的话主要就是在设置中进行调节,如果设置中没有相应的选项可以进行手动调节. 2 手动调节 2.1 手动屏幕调节 亮度由ACPI ...

  9. gateway调用Fegin失败问题解决

    起因 新项目用的是springcloud2.0,网关用gateway替换了zuul. gateway动态路由跟zuul有本质上的区别.这就涉及到webflux这一套大东东了.简单来说,gateway是 ...

  10. (转载)springboot + rabbitmq发送邮件(保证消息100%投递成功并被消费)

    转载自https://www.jianshu.com/p/dca01aad6bc8 一.先扔一张图   image.png 说明: 本文涵盖了关于RabbitMQ很多方面的知识点, 如: 消息发送确认 ...