关注公众号,后台回复
找书+ C++Primer
获取C++相关电子书。
定义函数
C++ 中的函数定义的一般形式如下:
return_type function_name( parameter list ){ body of the function}
在 C++ 中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:
-
返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。 -
函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。 -
参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。 -
函数主体:函数主体包含一组定义函数执行任务的语句。
每个 C++ 程序都至少有一个函数,即主函数main(),所有简单的程序都可以定义其他额外的函数。
调用函数
创建 C++ 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。
当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。
#include<stdio.h>// 函数声明intadd(int a, int b);// 函数定义intadd(int a, int b){ // 函数头 形参 return a + b;}intmain(){int num1 = 5;int num2 = 3;int sum = add(num1, num2); // 调用函数 实参printf("The sum of %d and %d is %dn", num1, num2, sum);return0;}
函数声明
函数可以声明多次,但是只能定义一次。声明必须在使用前,在main函数前,定义可以写在main后,或其他文件。
函数参数
如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。
形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
当调用函数时,有三种向函数传递参数的方式:
|
|
---|---|
|
|
|
|
|
|
默认情况下,C++ 使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的参数。之前提到的实例,调用 max() 函数时,使用了相同的方法。
值传递(pass by value)是指在函数调用时,将实参的值复制到形参中。这意味着在函数内部对形参的任何修改都不会影响到实参的值。num1和num2的值(即5和3)被复制到add函数的形参a和b中。函数内部对a和b的任何操作都不会改变num1和num2的值。函数返回计算结果a + b,这个结果被赋值给sum变量。 总结来说,num1和num2的值传递给了add函数的a和b,函数内部对a和b的操作不会影响到num1和num2。这就是值传递的基本概念。
#include<stdio.h>// 函数声明intadd(int a, int b);intmain(){int num1 = 5;int num2 = 3;// 输出调用add函数前的num1和num2的值printf("调用add函数前: num1 = %d, num2 = %dn", num1, num2);int sum = add(num1, num2);// 输出调用add函数后的num1和num2的值printf("调用add函数后: num1 = %d, num2 = %dn", num1, num2);printf("num1 和 num2 的和是 %dn", sum);return0;}// 函数定义intadd(int a, int b){// 输出add函数内部的a和b的值printf("在add函数内部: a = %d, b = %dn", a, b);// 交换a和b的值int temp = a; a = b; b = temp;// 输出交换后的a和b的值printf("交换后在add函数内部: a = %d, b = %dn", a, b);return a + b;}
参数的默认值
当您定义一个函数,您可以为参数列表中后边的每一个参数指定默认值。当调用函数时,如果实际参数的值留空,则使用这个默认值。
这是通过在函数定义中使用赋值运算符来为参数赋值的。调用函数时,如果未传递参数的值,则会使用默认值,如果指定了值,则会忽略默认值,使用传递的值。
C++函数类型中,常见的四类函数类型及其特点如下:
-
有参有返(int*)这是返回值与参数类型同时有关的函数。这些函数在运行时会将输入的数据传递给目标函数,并根据数据类型返回相应的输出结果。 -
有参无返(void)这类函数没有明确的返回值,但通常指定了一个可以被编译为值的对象(例如char)。这类函数不需要从函数名中看出返回类型。 -
无参有返(int)这是只接受零个或多个参数,并在运行时将所有输入的数据传递给目标函数。这些函数的输出数据必须由程序执行者自定义,而不是通过编译器直接编出。 -
无参无返(void)这类函数通常指定了一个可以被编译为值的对象(例如char),但没有明确返回任何类型的数据。
Lambda 函数与表达式
C++11 提供了对匿名函数的支持,称为 Lambda 函数(也叫 Lambda 表达式)。
Lambda 表达式把函数看作对象。Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值。
Lambda 表达式本质上与函数声明非常类似。Lambda 表达式具体形式如下:
[capture](parameters)->return-type{body}
函数的分文件编写
作用:让代码结构更加清晰 函数分文件编写一般有4个步骤
-
创建后缀名为.h的头文件 -
创建后缀名为.cpp的源文件 -
在头文件中写函数的声明 -
在源文件中写函数的定义
将之前的加法交换代码分成多个文件:头文件、源文件和主文件。以下是分文件后的代码结构:
-
add.h - 头文件,包含函数声明。 -
add.cpp - 源文件,包含函数定义。 -
main.cpp - 主文件,包含 main 函数。
main.cpp
代码如下
#include<iostream>#include"add.h"intmain(){int num1 = 5;int num2 = 3;// 输出调用add函数前的num1和num2的值std::cout << "调用add函数前: num1 = " << num1 << ", num2 = " << num2 << std::endl;int sum = add(num1, num2);// 输出调用add函数后的num1和num2的值std::cout << "调用add函数后: num1 = " << num1 << ", num2 = " << num2 << std::endl;std::cout << "num1 和 num2 的和是 " << sum << std::endl;return0;}
add.cpp
代码如下
#include<iostream>#include"add.h"// 函数定义intadd(int a, int b){// 输出add函数内部的a和b的值std::cout << "在add函数内部: a = " << a << ", b = " << b << std::endl;// 交换a和b的值int temp = a; a = b; b = temp; // 将a的值赋给b,将b的值赋给a // 输出交换后的a和b的值std::cout << "交换后在add函数内部: a = " << a << ", b = " << b << std::endl;return a + b;}
add.h
代码如下
#pragma once#ifndef ADD_H#define ADD_H// 函数声明intadd(int a, int b);#endif// ADD_H
🔔 想要获取更多网络安全与编程技术干货?
关注 泷羽Sec-静安 公众号,与你一起探索前沿技术,分享实用的学习资源与工具。我们专注于深入分析,拒绝浮躁,只做最实用的技术分享!💻
扫描下方二维码,马上加入我们,共同成长!🌟
👉 长按或扫描二维码关注公众号
或者直接回复文章中的关键词,获取更多技术资料与书单推荐!📚
原文始发于微信公众号(泷羽Sec-静安):06x函数50-55
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论