吴裕雄--天生自然C++语言学习笔记:C++ 函数
- 函数是一组一起执行一个任务的语句。每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。
- 可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。
- 函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。
- C++ 标准库提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置。
- 函数还有很多叫法,比如方法、子例程或程序,等等。
- C++ 中的函数定义的一般形式如下:
- return_type function_name( parameter list )
- {
- body of the function
- }
- 在 C++ 中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:
- 返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
- 函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
- 参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
- 函数主体:函数主体包含一组定义函数执行任务的语句。
- 以下是 max() 函数的源代码。该函数有两个参数 num1 和 num2,会返回这两个数中较大的那个数:
- // 函数返回两个数中较大的那个数
- int max(int num1, int num2)
- {
- // 局部变量声明
- int result;
- if (num1 > num2)
- result = num1;
- else
- result = num2;
- return result;
- }
- 函数声明包括以下几个部分:
- return_type function_name( parameter list );
- 针对上面定义的函数 max(),以下是函数声明:
- int max(int num1, int num2);
- 在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:
- int max(int, int);
- 当在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的。在这种情况下,应该在调用函数的文件顶部声明函数。
- 创建 C++ 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。
- 当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
- 调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。例如:
- #include <iostream>
- using namespace std;
- // 函数声明
- int max(int num1, int num2);
- int main ()
- {
- // 局部变量声明
- int a = ;
- int b = ;
- int ret;
- // 调用函数来获取最大值
- ret = max(a, b);
- cout << "Max value is : " << ret << endl;
- return ;
- }
- // 函数返回两个数中较大的那个数
- int max(int num1, int num2)
- {
- // 局部变量声明
- int result;
- if (num1 > num2)
- result = num1;
- else
- result = num2;
- return result;
- }
- 把 max() 函数和 main() 函数放一块,编译源代码。当运行最后的可执行文件时,会产生下列结果:
- Max value is :
- 如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。
- 形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
- 当调用函数时,有三种向函数传递参数的方式:
- 传值调用 该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。
- 指针调用 该方法把参数的地址复制给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
- 引用调用 该方法把参数的引用复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
- 默认情况下,C++ 使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的参数。之前提到的实例,调用 max() 函数时,使用了相同的方法。
- 参数的默认值
- 当定义一个函数,您可以为参数列表中后边的每一个参数指定默认值。当调用函数时,如果实际参数的值留空,则使用这个默认值。
- 这是通过在函数定义中使用赋值运算符来为参数赋值的。调用函数时,如果未传递参数的值,则会使用默认值,如果指定了值,则会忽略默认值,使用传递的值。请看下面的实例:
- int main ()
- {
- // 局部变量声明
- int a = ;
- int b = ;
- int result;
- // 调用函数来添加值
- result = sum(a, b);
- cout << "Total value is :" << result << endl;
- // 再次调用函数
- result = sum(a);
- cout << "Total value is :" << result << endl;
- return ;
- }
- 当上面的代码被编译和执行时,它会产生下列结果:
- Total value is :
- Total value is :
- Lambda 函数与表达式
- C++ 提供了对匿名函数的支持,称为 Lambda 函数(也叫 Lambda 表达式)。
- Lambda 表达式把函数看作对象。Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值。
- Lambda 表达式本质上与函数声明非常类似。Lambda 表达式具体形式如下:
- [capture](parameters)->return-type{body}
- [](int x, int y){ return x < y ; }
- 如果没有返回值可以表示为:
- [capture](parameters){body}
- []{ ++global_x; }
- 在一个更为复杂的例子中,返回类型可以被明确的指定如下:
- [](int x, int y) -> int { int z = x + y; return z + x; }
- C++变量传递有传值和传引用的区别。可以通过前面的[]来指定:
- [] // 沒有定义任何变量。使用未定义变量会引发错误。
- [x, &y] // x以传值方式传入(默认),y以引用方式传入。
- [&] // 任何被使用到的外部变量都隐式地以引用方式加以引用。
- [=] // 任何被使用到的外部变量都隐式地以传值方式加以引用。
- [&, x] // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
- [=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。
- 另外有一点需要注意。对于[=]或[&]的形式,lambda 表达式可以直接使用 this 指针。但是,对于[]的形式,如果要使用 this 指针,必须显式传入:
- [this]() { this->someFunc(); }();
吴裕雄--天生自然C++语言学习笔记:C++ 函数的更多相关文章
- 吴裕雄--天生自然C++语言学习笔记:C++ 标准库
C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 动态内存
栈:在函数内部声明的所有变量都将占用栈内存. 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存. 可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址.这种运 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 类 & 对象
C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计.类是 C++ 的核心特性,通常被称为用户定义的类型. 类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法.类中的 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 日期 & 时间
C++ 标准库没有提供所谓的日期类型.C++ 继承了 C 语言用于日期和时间操作的结构和函数.为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 <ctime> 头文件. 有四 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 字符串
C++ 提供了以下两种类型的字符串表示形式: C 风格字符串 C++ 引入的 string 类类型 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持.字符串实际上是使用 null 字符 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 基本语法
C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互. 对象 - 对象具有状态和行为.例如:一只狗的状态 - 颜色.名称.品种,行为 - 摇动.叫唤.吃.对象是类的实例. 类 - 类可 ...
- 吴裕雄--天生自然C++语言学习笔记:C++简介
C++ 是一种中级语言,它是由 Bjarne Stroustrup 于 年在贝尔实验室开始设计开发的.C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言.C++ 可运行于多种平台上,如 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 实例
C++ 实例 - 输出 "Hello, World!" #include <iostream> using namespace std; int main() { co ...
- 吴裕雄--天生自然C++语言学习笔记:C++ STL 教程
C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表.队列.栈. C++ 标准模板库的核心包括以 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ Web 编程
什么是 CGI? 公共网关接口(CGI),是一套标准,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的. CGI 规范目前是由 NCSA 维护的,NCSA 定义 CGI 如下: 公共网关接 ...
随机推荐
- rendering path定义了什么?有哪些?有什么作用?有什么限制?
rendering path 定义了光照在一个shader pass中处理的对象与顺序,如逐像素处理,逐顶点处理,向前处理,后向 deferred用于处理不透明物体,会先把它们根据深度检测,过滤后的内 ...
- 在webView中除去广告
首先建一个ADFilterTool.java类 代码如下 import android.content.Context; import android.content.res.Resources; p ...
- eclipse安装SVN插件的两种方法
eclipse里安装SVN插件,一般来说,有两种方式: 直接下载SVN插件,将其解压到eclipse的对应目录里 使用eclipse 里Help菜单的“Install New Software”,通过 ...
- JDBC--批量处理
1.当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理,这样可以提高处理速度. 2.JDBC的批量处理语句包括两个方法: --1)addBat ...
- 搞懂G1垃圾收集器
一.G1 GC术语Overview 1.1 并发 并发的意思是Java应用执行和垃圾收集活动可以同时进行 1.2 并行 并行的意思是垃圾收集运算是多线程执行的,比如CMS垃圾收集器的年轻代就是并行的, ...
- Java得到一个整数的绝对值,不使用任何判断和比较语句,包括API.
/** * Java得到一个整数的绝对值,不使用任何判断和比较语句,包括API. <br> * 1.不得使用任何API,如Math.abs()等.<br> * 2.不得使用判断 ...
- hadoop 第一个 mapreduce 程序(对MapReduce的几种固定代码的理解)
1.2MapReduce 和 HDFS 是如何工作的 MapReduce 其实是两部分,先是 Map 过程,然后是 Reduce 过程.从词频计算来说,假设某个文件块里的一行文字是”Thisis a ...
- mysql文件理解
mysql_Innodb的undo_log和redo_log 原创 2014年10月28日 11:26:34 众所周知,mysql支持多种存储引擎,现在常用的是MyISAM和InnoDB.MyIS ...
- 初级入门 --- web GL绘制点
" 万丈高楼平地起." 01基础知识 一.相关术语 图元 :WebGL 能够绘制的基本图形元素,包含三种:点.线段.三角形. 片元:可以理解为像素,像素着色阶段是在片元着色器中. ...
- metasploit扫描
实验目的: 一. 基于TCP协议收集主机信息 二. 基于SNMP协议收集主机信息 三. 基于SMB协议收集信息 四. 基于SSH协议收集信息 五. 基于FTP协议收集信息 实验环境: ...