本篇要学习的内容和知识结构概览

函数的参数及其传递方式

1. 函数参数传递方式

传值:

传变量值: 将实参内存中的内容拷贝一份给形参, 两者是不同的两块内存

传地址值: 将实参所对应的内存空间的地址值给形参, 形参是一个指针, 指向实参所对应的内存空间

传引用:

形参是对实参的引用, 形参和实参是同一块内存空间

2. 对象作为函数参数, 也就是传变量值

将实参对象的值传递给形参对象, 形参是实参的备份, 当在函数中改变形参的值时, 改变的是这个备份中的值, 不影响原来的值

像这样:

3. 对象指针作为函数参数, 也就是传地址值

形参是对象指针, 实参是对象的地址值, 虽然参数传递方式仍然是传递方式, 因为形参和实参的地址值一样, 所以它们都指向同一块内存, 我们通过指针更改所指向的内存中的内容, 所以当在函数中通过形参改变内存中的值时, 改变的就是原来实参的值

像这样:

对于数组, 因数组名就是代表的数组首地址, 所以数组也能用传数组地址值的方式

4. 引用作为函数参数, 也就是传地址(注意: 这里不是地址值)

在函数调用时, 实参对象名传给形参对象名, 形参对象名就成为实参对象名的别名. 实参对象和形参对象代表同一个对象, 所以改变形参对象的值就是改变实参对象的值

像这样:

优点: 引用对象不是一个独立的对象,不单独占内存单元, 而对象指针要另外开辟内存单元(内存中放实参传过来的地址),所以传引用比传指针更好用。

5. 默认参数

不要求程序在调用时必须设定该参数, 而由编译器在需要时给该参数赋默认值.

规则1:当程序需要传递特定值时需要显式的指明. 默认参数必须在函数原型中说明.

如果函数在main函数后面定义, 而在声明中设置默认参数, 在定义中不需要设置默认参数

像这样:

如果函数在main函数前面定义, 则在定义中设置默认参数

像这样:

规则2:默认参数可以多于一个,但必须放在参数序列的后部。

像这样:

可以有一个默认参数:void PrintValue(int a, int b, int c = 0);

可以是有多个默认参数:void PrintValue(int a, int b = 0, int c = 0);

不可以在中间设置默认参数:void PrintValue(int a, int b = 0, int c);

规则3:如果一个默认参数需要指定一个特定值时,则在此之前的所有参数都必须赋值

6. 使用const保护数据

用const修饰要传递的参数, 该函数只能使用参数, 而无权修改参数, 以提高系统的自身安全.

像这样:

函数返回值

C++函数返回值类型可以是除数组和函数以外的任何类型

当返回值是指针或引用对象时, 需要注意函数返回值所指的对象必须存在, 因此不能将函数内部的局部对象作为函数返回值, 因为函数内, 局部变量或者对象在函数运行完毕后内存就释放了

1. 返回引用的函数

函数可以返回一个引用, 目的是为了让该函数位于赋值运算符的左边

格式: 数据类型 & 函数名(参数列表);

像这样:

2. 返回指针的函数

返回值是存储某种数据类型数据的内存地址, 这种函数称为指针函数

格式: 数据类型 * 函数名(参数列表);

像这样:

3. 返回对象的函数

格式: 数据类型 函数名(参数列表);

像这样:

4. 函数返回值作为函数参数

如果函数返回值作为另一个函数的参数, 那么这个返回值必须与另一个函数的参数类型一致

像这样:

内联函数

1. 内联函数的概念

使用关键字inline声明的函数称为内联函数, 内联函数必须在程序中第一次调用此函数的语句出现之前定义, 这样编译器才知道内联函数的函数虚, 然后进行替换

像这样:

2. 注意

在C++中, 除具有循环语句, switch语句的函数不能说明为内联函数外, 其它函数都可以说明为内联函数.

3. 作用

使用内联函数可以提高程序执行速度, 但如果函数体语句多, 则会增加程序代码量.

函数重载和默认参数

1. 函数重载

一个函数名具有多种功能, 具有多种形态, 称这种我为多态性, 一个名字, 多个函数

函数重载要满足的条件:

参数类型不同或者参数个数不同

像这样:

2. 函数重载与默认参数

当函数重载与默认参数相结合时, 能够有效减少函数个数及形态, 缩减代码规模.

这样我们每种数据类型只保留一个函数即可完成我们的功能, 直接少了两个函数.

像这样:

如果使用默认参数, 就不能对参数个数少于默认个数的函数形态进行重载, 只能对于多于默认参数个数的函数形态进行重载.

像这样:

函数模板

从而上面可以看出, 它们是逻辑功能完全一样的函数, 所提供的函数体也一样, 区别仅仅是数据类型不同, 为了统一的处理它们, 引入了函数模板.

现在我们的函数从4个缩减成一个, 但是我们的功能没有减少, 反而增加了. 比如我们可以计算char, float类型

1. 什么是函数模板

在程序设计时没有使用实际存在的类型, 而是使用虚拟的参数参数, 故其灵活性得到加强.

当用实际的类型来实例化这种函数时, 就好像按照模板来制造新的函数一样, 所以称为函数模板

格式: 一般用T来标识类型参数, 也可以用其它的

Template

像这样:

当应用函数模板与具体的数据类型连用时, 就产生了模板函数, 又称为函数模板实例化

2. 函数模板的参数

函数模板名(参数列表);

我们可以将参数列表的数据强制转换为指定的数据类型

像这样:int sumValue2 = sumWithValue(3.2, 5.1);

我们将参数列表里的数据强制转换为int类型, 再参与计算

也可以样:double sumValue2 = sumWithValue(3.2, (double)5);

我们也可以将参数列表里的单个参数进行强制类型转换, 再参与计算

不过我们一般不会加上模板参数.

3. 使用关键字typename

用途就是代替template参数列表中的关键字class

像这样

template

只是将class替换为typename, 其它一样使用.

强烈建议大家使用typename, 因为它就是为模板服务的, 而class是在typename出现之前使用的, 它还有定义类的作用, 不直观, 也会在一些其它地方编译时报错.

总结:

可能对于初学者来说, 函数有点不是很好理解, 包括我当初也是, 不要想得过于复杂, 其实它就是一段有特定功能的代码, 只不过我们给这段代码起了个名字而已, 这样就会提高代码的可读性和易维护性。

自学C/C++编程难度很大,不妨和一些志同道合的小伙伴一起学习成长!

C语言C++编程学习交流圈子,关注+私信【C/C++编程】微信公众号:C语言编程学习基地

有一些源码和资料分享,欢迎转行也学习编程的伙伴,和大家一起交流成长会比自己琢磨更快哦!

c++ 函数模板_C/C++编程笔记:C++入门知识,深入解析C++函数和函数模板相关推荐

  1. c语言 万能函数指针,C/C++编程笔记:C语言精华解析之void *指针,指针中的万能指针...

    什么是万能指针? 万能指针其实就是void *类型的指针,而void *指针一般被称为通用指针或叫泛指针.它是C语言关于纯粹地址的一种约定.当某个指针是void型指针时,所指向的对象不属于任何类型. ...

  2. 子类重写父类虚函数_C/C++编程笔记:关于C++的虚函数和多态,你真的了解吗?...

    前言 本章节主要针对于C++中的虚函数和多态做一个详细介绍. 虚函数 虚函数的长相其实很简单,在C++类型用virtual修饰的函数就是虚函数,如下代码: 虚函数对于本类的影响:存在虚函数类的内存会多 ...

  3. c语言 方程改main的值_C语言编程笔记丨编写第一个C语言程序hello world,我教你哇...

    如果用C语言输出:Hello,world!,该如何编写程序? **代码如下:** #include//包含标准库的信息 main()//定义名为main的函数,不接受参数值 {//main函数的语句都 ...

  4. java兔子问题流程图_C语言编程狼追兔子问题代码解析

    原标题:C语言编程狼追兔子问题代码解析 问题描述 一只兔子躲进了10个环形分布的洞中的一个.狼在第一个洞中没有找到兔子,就隔一个洞,到第3个洞去找:也没有找到,就隔2个洞,到第6个洞去找:以后每次多一 ...

  5. visual c++ 6.0原版_C/C++编程笔记:C语言函数指针的理解与使用,就是这么简单明了!...

    1.函数指针的定义 顾名思义,函数指针就是函数的指针.它是一个指针,指向一个函数.看例子: 看看上面三个表达式分别是什么意思? C)这很容易,fun3是函数名,p1,p2是参数,其类型为char *型 ...

  6. c 结构体在声明时赋值_C/C++编程笔记:C++入门知识,C++多态性和虚函数解析

    本篇要学习的内容和知识结构概览 多态性 编译时的多态性称为静态联编. 当调用重载函数时, 在编译期就确定下来调用哪个函数. 运行时的多态性称为动态联编. 在运行时才能确定调用哪个函数, 由虚函数来支持 ...

  7. c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  8. c++重载运算符_C/C++编程笔记:运算符重载丨重载C++中的New和Delete运算符

    new和delete运算符也可以像C ++中的其他运算符一样重载.New和Delete运算符可以全局重载,也可以在特定类中重载. (1)如果使用某个类的成员函数来重载这些运算符,则意味着这些运算符仅针 ...

  9. c语言求阶乘和的流程图_C/C++编程笔记:C语言 rand() 随机函数,深入解析程序随机数!...

    各种编程语言返回的随机数(确切地说是伪随机数)实际上都是根据递推公式计算的一组数值,当序列足够长,这组数值近似满足均匀分布. C的标准函数库提供一随机数生成器rand(定义在stdlib.h),能返回 ...

最新文章

  1. C/MFC如何获得应用程序当前路径(整理)
  2. android ADT学习总结
  3. Qracle学习:字符串相关函数
  4. HTML中的function函数命名,请问HTML function函数怎么定义和调用?
  5. Apache Hadoop下一代MapReduce框架(YARN)简介 (Apache Hadoop NextGen MapReduce (YARN))
  6. 小米线刷一直显示flashing_小米空调质量怎么样 小米空调一晚上多少电 看完这篇你就有数了...
  7. iscsi:IO操作流程(四)
  8. 父级div没高度不能自适应高度的原因——子级使用css float浮动
  9. vb 源代码格式化工具,Visual Basic程序源代码格式化工具
  10. 如何用文本文档编写python程序
  11. IDEA 界面主题字体修改
  12. JAVAWEB(三)Java与数据库(JUnit、JUL、Maven、图书管理系统)
  13. DM7.0在VM-中标麒麟NeoKylin虚拟机上安装
  14. SKU 和 SPU 有什么区别?
  15. 百度竞价推广的十大误区
  16. 三菱FX2NPLC CMP比较指令
  17. 企业网站新闻显示页面(HTML+CSS)
  18. python微博涨粉_如何用 Python 让微博热搜榜动起来
  19. 前端面试——JS去除首尾空格代码
  20. 机加工图纸有英语看不懂?最全的翻译都在这

热门文章

  1. 元宇宙教不会区块链赚钱
  2. 软件管家公众号_软件安装管家:大学生最值得关注的公众号
  3. java中有哪几种注释方式_在 Java 中, 有多种注释方法,其中 __________ 适用于单行注释。...
  4. Oracle中的within,Oracle函数 --聚合函数中的语法within group
  5. ue编辑器拖拽上传图片_为百度UE编辑器上传图片添加水印功能
  6. 9b9t服务器显示连接超时,Fabric-sdk-go实例化链码连接7053端口等待超时
  7. php求未知数怎么求,PHP的-输入未知数的字段到MySQL-为此的最佳...
  8. n3k配置vpc是否还需要配置hsrp_VPC配置介绍
  9. 【Python教程】两种方法教你拆分含有多种分隔符的字符串
  10. 5道Python函数练习