C++第三章复习与总结(思维导图分享)

在完成了第三章的学习后,为了便于日后的复习整理,我制作了一张思维导图,有需要的可以自取。
函数的定义与使用
带默认值的函数
在C++中我们可以为函数添加默认的参数值,在调用时可不传入或部分传入参数,为传入的部分便会采用默认值。
带默认参数的函数可以放在main函数前。
#include <iostream>
using namespace std;
int add(int a = 5, int b = 6)
{
return a + b;
}
int main(void)
{
cout<<add();
return 0;
}
也可把函数放在main函数后,将默认值放在函数声明中。
这种情况下,默认值只可出现在函数声明中,不可出现在函数定义中
#include <iostream>
using namespace std;
int add(int a = 5, int b = 6);
int main(void)
{
cout << add();
return 0;
}
int add(int a, int b) //add(int a = 5,b = 6)为错误写法
{
return a + b;
}
内联函数
C++中添加了一个新的关键字inline,在函数定义前加上即可将函数嵌入所有调用函数的地方,以此来消除调用函数时产生的时间开销,适用于简单且规模小的函数。
内联函数的定义非常简单,但是使用时也有一些注意点。
关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。(摘自高质量C++/C 编程指南)
参数传递
值传递
C++中的值传递与C语言中的值传递并无两样。在发生普通的函数调用时,系统会给形参分配空间并用实参的值给形参初始化。

所以,对形参的任何改动都不会对实参产生影响,需求的结果都通过返回值传回。
引用传递
引用是一种特殊类型的变量,可看作另一个变量的别称。

对引用的改动会直接反映到被引用的变量上。
函数重载
C++中的函数重载允许我们使用相同的函数名却使用不同数据类型的数据与返回值,在进行函数调用的时候,编译器会自动根据数据类型选择合适的函数。
普通的函数重载
一般的函数重载要求我们为每一个数据类型写一个函数,函数名相同,只有参数的数据类型和返回值的数据类型不同。
比如我要实现一个add函数,可以对double int complex实现相加操作。
#include <complex>
#include <iostream>
using namespace std;
int add(int, int);
double add(double, double);
complex<double> add(complex<double>, complex<double>);
int main()
{
int a = 1, b = 5;
double x = 1.12, y = 5.36;
complex<double> m{2.2, 5.4};
complex<double> n{3.5, 2.1};
cout << add(a, b) << endl;
cout << add(x, y) << endl;
cout << add(m, n).real() << "+" << add(m, n).imag() << "i" << endl;
return 0;
}
int add(int a, int b)
{
return a + b;
}
double add(double a, double b)
{
return a + b;
}
complex<double> add(complex<double> a, complex<double> b)
{
return a + b;
}
就可以实现这样的输出,函数的使用更加符合人们日常生活中的逻辑了。

用函数模板实现函数重载
还是觉得麻烦?
C++中有一个更方便的方法,就是使用函数模板。但是函数模板有它的缺点,就是只有除了数据类型不同,其他代码一模一样的函数才能使用函数模板合并,我们上文中例子里的三个函数刚好都符合,那么就可以使用函数模板将他们合并。
#include <complex>
#include <iostream>
using namespace std;
template <typename T>
T add(T a, T b)
{
return a + b;
}
int main()
{
int a = 1, b = 5;
double x = 1.12, y = 5.36;
complex<double> m{2.2, 5.4};
complex<double> n{3.5, 2.1};
cout << add(a, b) << endl;
cout << add(x, y) << endl;
cout << add(m, n).real() << "+" << add(m, n).imag() << "i" << endl;
cin.get();
return 0;
}
这样,我们只需要写一遍逻辑就可以多处重复使用,代码也更加简洁易读。事实上用函数模板写的函数在使用时也可以指定数据类型 add<typename>(),但为了方便使用,我们一般让编译器从传递给函数的实参推断类型参数,这一功能被称为模板实参推断 。
C++系统函数
除了直接可以根据需求写出我们自己的函数,C++的系统库为我们提供了几百个函数。要使用它们,只需要将函数所在的头文件包含进我们直接的源文件中,便可以直接调用。要知道函数所在的头文件或者想知道C++是否提供了想要的函数,都可以访问cppreference网站查询。
C++第三章复习与总结(思维导图分享)的更多相关文章
- 思维导图分享以及MindManager使用说明
来源于: http://www.cnblogs.com/muhongxing/archive/2009/12/22/1628782.html http://www.cnblogs.com/muhong ...
- 曹工说Spring Boot源码系列开讲了(1)-- Bean Definition到底是什么,附spring思维导图分享
写在前面的话&&About me 网上写spring的文章多如牛毛,为什么还要写呢,因为,很简单,那是人家写的:网上都鼓励你不要造轮子,为什么你还要造呢,因为,那不是你造的. 我不是要 ...
- C++第二章复习与总结(思维导图分享)
在完成了第二章的学习后,为了便于日后的复习整理,我制作了一张思维导图,有需要的可以自取. 基本数据类型 基础类型在cppreference网站上有非常完备的介绍,我一句话两句话也说不清,具体网址我会给 ...
- JS高程读书笔记-第一、二章-内附在线思维导图和quizlet卡片
之前在kindle上买了高程,今天又到了纸质的<JavaScript语言精粹>,<高性能JavaScript>,<JavaScipt设计模式>,开始读书之旅啦. 我 ...
- 「工具」三分钟了解一款思维导图工具:XMind Zen
一款非常实用的商业思维导图软件,融合艺术与创造力.致力于高效的可视化思维,强调软件的跨平台使用,帮助用户提高生产效率. 相关信息 · 操作系统:macOS / Windows / Linux · 官方 ...
- Java相关思维导图分享
非常多朋友都给我发私信希望获得一份Java知识的思维导图,我来不及一一答复.原先是给大家一个百度网盘的链接分享,大家能够自己去下载,可是不知道云盘还能用多久.把相关资源转移到了QQ的群共享中.须要的朋 ...
- 2020面试还搞不懂MyBatis?快看看这27道面试题!(含答案和思维导图)
前言 MyBatis是一个优秀的持久层ORM框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL 本身,而不需要花费精力去处理例如注册驱动.创建connection.创建statem ...
- 查漏补缺:2020年搞定SpringCloud面试(含答案和思维导图)
前言 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均衡.断路器.数据监控等,都 ...
- 考研党其实可以用思维导图MindManager做考研复习计划
近年由于就业压力,个人学历提升等各种原因,考研的人数越来越多了,相对难度也越来越大了,尽管今年研究生招生规模同比去年增加18.9万,但也无法掩盖考研的竞争逐年激烈. 身为考研大军中的预备选手之一,小编 ...
随机推荐
- 2019-04-20 Python之科学计算库学习总结
一.numpy库和matplotlib库的学习 (1)numpy库介绍:科学计算包,支持N维数组运算.处理大型矩阵.成熟的广播函数库.矢量运算.线性代数.傅里叶变换.随机数生成,并可与C++/Fort ...
- Python类__call__()方法
在python中,创建类型的时候定义了__call__()方法,那这个类型创建出来的实例就是可调用的.例def如: class A(object): def __init__(self,name,ag ...
- Java bean 转 Map
Java bean 转 Map 时需要使用Fastjson //方法 一 Map<String, Object> a = (Map<String, Object>)JSON.t ...
- eclipse二、保证svn导入的项目正常运行
1.环境说明 eclipse4.11 需要jdk1.8支持 公司项目大都jdk1.6与jdk1.5 为保持公司项目正常运行而配置jdk运行场景 2.window需按照jdk1.8.jdk1.6 jdk ...
- 铁大Facebook隐私保护NABCD
隐私保护功能: N:满足了用户保护自己隐私信息的需求 A:对每一项用户可能需要保护的信息,我们都会添加仅自己可见.指定人可见.部分人可见或所有人可见设置 B:让用户的信息受到更全面的保护,而不仅仅是对 ...
- CF822D 贪心+递推
CF822D [题目链接]CF822D [题目类型]贪心+递推 &题意: 给你n个人,你可以把他们分组,但必须保持每组相等,分组之后每2个人会比赛,比如一组有i个人,那么就要比赛 次,f[i] ...
- MongoDB在Windows系统下的安装和启动
版本选择MongoDB的版本命名规范如:x.y.z: y为奇数时表示当前版本为开发版,如:2.3.0.2.1.1: y为偶数时表示当前版本为稳定版,如:2.0.1.2.2.0: 目前官网上最新的版本为 ...
- Jenkins - ERROR: Exception when publishing, exception message [Failed to connect session for config [IP(projectName)]. Message [Auth fail]]
今天在处理Jenkins的时候出现了一些异常,看着控制台,编译都是通过的,只是没有部署上来,查看了控制台日志,如下: 刚开始以为磁盘满了(参考:https://www.cnblogs.com/yuch ...
- c#中可变参数params关键字学习
引用 https://www.cnblogs.com/maowp/p/8134342.html 基础知识 1.概念 params 是C#开发语言中关键字, params主要的用处是在给函数传参数的时候 ...
- win7插着网线开机卡死,拔下网线开机正常
公司的部分win7电脑插着网线开机,进到桌面后网络图标转圈圈卡住.控制面板,启动项,任务管理器等都打不开.把网线拔下后再开机,电脑正常进入系统,后再插上网线就能正常上网了.被这个问题困扰了很久,百度也 ...