c++函数调用

article/2025/9/1 12:47:26

一个函数就是完成一项任务的独立代码块,它以名字作为整个代码块的代表

函数完成任务后,如果有数值需要返回,则在声明函数时,在函数名前写好返回值类型

如果不需要返回任何值,则在函数名前写 void

有时,一个函数还需要传入一些参数,参数列表写在函数名后的一对小括号中

参数列表是用逗号隔开的,每个参数都要注明其类型

即使没有参数需要传入,函数名后的小括号也不能省略

通常函数名以“动词+名词”的方式命名,中间以一个下划线隔开(C\C++风格)

#include <cstdio>
int add(int a, int b) {return a + b;
}
int main() {int x, y;scanf("%d%d", &x, &y);printf("%d", add(x, y));return 0;
}

函数的定义和调用

1,模块化:一个较大的程序一般应分为若干个程序模块,每个模块用来实现一个特定的功能

2,模块(C 函数)是由完成一特定任务的说明语句和执行语句组成的基本功能单元。可提供给主程序或其它函数使用,函数执行完毕后,返回一个结果给调用程序。如此可以减少重复编写程序段的工作量,来提高软件开发的时间效率

3,一个程序中函数调用的示意图(如下)

举个例子:

#include <iostream>void printstar()          //输出一排星号函数
{cout << "***************************\n";
}void print_message() //输出一行信息函数
{cout << "      How do you do!\n";
}int main( )
{  printstar();        //调用 printstar 函数print_message();    //调用 print_message 函数printstar();         //调用 printstar 函数return 0;
}

输出结果:

*************************** How do you do! 
***************************

说明

1,在 C++ 中,所有程序模块都被当作函数对待

2,一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位,而不是以函数为单位进行编译

3,一个 C++ 程序由一个或多个源程序文件组成。对较大的程序,一般不希望全放在一个文件中,而将函数和其它内容分别放到若干个源文件中,再由若干源文件组成一个C++ 程序。这样可以分别编写、分别编译,提高调试效率。一个源程序文件可为多个 C++ 程序公用。

4,C++ 程序的执行总是从 main 函数开始,调用其它函数后流程返回到 main 函数,在 main 函数中结束整个程序的运行。main 函数是系统定义的

5,所有函数都是平行的,即在定义函数时是互相独立,一个函数并不从属于另一个函数,即函数不能嵌套定义

6,函数间可以相互调用,但不能调用 main 函数,main 函数可调用所有函数

函数的基本定义

~声明、定义、调用~

1. 函数声明

告诉编译器它所提供的名字是一个函数的名称;在源代码中使用时它所需要的数据类型;在完成时它将会返回的数据的类型

2. 函数定义(函数实现)

是一组指令,告诉编译器一个函数是如何执行任务的

3. 函数调用(函数使用)

即使用这个函数

函数的声明和调用

·函数是面向对象程序设计中,对功能的抽象

·函数定义的语法形式

类型标识符  函数名(形式参数表)                        
{  语句序列
}

形式参数表

<type_1> name_1, <type_2> name_2, ..., <type_n> name_n

函数的返回值

·由 return 语句给出,例如:return 0

·无返回值的函数(void类型),不必写return语句。

形式参数和实际参数

·大多数情况下,主调函数和被调用函数之间有数据传递关系。

·在定义函数时,函数名后面括弧中的变量名称为“形式参数”(简称“形参”)。

·在调用函数时,函数名后面括弧中的表达式称为“实际参数”(简称“实参”)。

形参

·在被定义的函数中,必须指定形参的类型

·在定义函数时指定的形参变量,在未出现函数调用时,它们并不占内存中的存储单元;只有在发生函数调用时,函数 max 中的形参才被分配内存单元

·在调用结束后,形参所占的内存单元也被释放

实参

·实参可以是常量、变量、表达式 、指针,但要求它们有确定的值

·在调用时将实参的值赋给形参变量

·实参与形参的类型应一致,否则发生“类型不匹配”的错误。字符型与整型可以互相通用

·调用结束后,实参单元仍保留

函数返回值

~通常,希望通过函数调用使主调函数能得到一个确定的值,这就是函数的返回值~

·函数的返回值通过函数中的 return 语句获得的,语句格式:

return ; //仅返回程序执行的控制权

return 表达式 ; //返回控制权及函数值

·先计算出表达式的值,然后按函数类型返回给调用函数作为调用函数的值

·一个函数可有 1 个以上的 return 语句

·如无返回语句 return,则在执行完最后一个语句时,把控制返回到调用函数。返回后,从调用函数处继续往下执行

凡不加类型说明的函数,函数值的类型一律自动按整型处理

如果函数值的类型和 return 语句中表达式的值不一致,则以函数类型为准。即函数类型决定返回值的类型

·一般,函数返回一个值。为了明确表示“不返回值”,一般应用 “ void ” 定义为 “无类型”(或称“空类型”),以此保证正确调用,使程序减少出错

例子

输出两个数的最大值:

#include <bits/stdc++.h>
using namespace std;
int  max ( int x,  int y )
{return   x>y ? x : y;   
}int main( )
{  int a,b;cin >> a >> b;cout << "max=" << max(a,b);return 0;
}

函数的声明与使用

1,调用前先声明函数原型:

·在调用函数中,或程序文件中所有函数之外,按如下形式说明:

·类型标识符 被调用函数名 (含类型说明的形参表);

2,调用形式

·函数名(实参列表)

3,嵌套调用

·函数可以嵌套调用,但不允许嵌套定义。

4,递归调用

·函数直接或间接调用自身。

按函数在程序中出现的位置来分,可以有以下三种函数调用方式:
1,函数语句把函数调用作为一个语句,此时不要有返回值,如:printstar( );2,函数表达式函数出现在表达式中,要求函数返回一个确定的值,如:c = 2*max(a,b);3,函数参数函数调用得到的值又作为另一个函数的实参,如:m = max(a, max(b, c));
注意:

~对函数的“定义”和“声明”不是一回事~

1,函数定义是指对函数功能的确立,包括指定函数名、函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。

2,函数声明(即函数原型的声明)是使编译器可以检查传入函数的参数个数、类型和顺序,它不包括函数体,以便在主调函数中按此类型对函数值作相应的处理。

例子

如果将函数的主体写在调用程序的前面,则函数可以不必事先声明

#include  <iostream>
int  max( int x,  int y )
{int z;z = x>y ? x : y;return z;
}
int  main( )
{int a,b,c;cin >> a >> b;c = max(a,b);cout << "max=" << c;return 0;
}

如果写在调用程序的后面,则必须事先声明函数的原型,避免发生编译错误。因为编译器在编译程序时,是从程序的第一行开始逐行编译,如果先调用,则无法分配执行该函数的地址。

#include  <iostream>
int max( int,  int );  //函数原型声明
int  main( )
{int a,b,c;cin >> a >> b;c = max(a,b);cout << "max=" << c;return 0;
} 
int  max( int x,  int y )
{int z;z = x>y ? x : y;return z;
}

递归调用

·函数直接或间接地调用自身,称为递归调用。

·递归过程的两个阶段:

1,递推:4!=4×3! → 3!=3×2! → 2!=2×1! → 1!=1×0! → 0!=1(未知转已知)

2,回归:4!=4×3!=24←3!=3×2!=6←2!=2×1!=2←1!=1×0!=1←0!=1(已知转未知)

函数的参数传递机制

1,参数就是主调函数传递给被调函数的数据变量,是两者的沟通渠道

2,引入参数,使得函数的运用更加灵活。

3,参数传递的方法:

1)传递变量本身的值—传值调用

2)传递变量地址的值—传址调用

3)传递变量地址的值—引用调用(C++ 中)

4,主调函数与被调用函数参数表中的参数个数、参数类型、参数顺序应注意保持一致

传递参数值

·在函数被调用时才分配形参的存储单元。

·实参可以是常量、变量或表达式。

·形参只能是变量。

·实参类型必须与形参相符。

传递时是传递参数值,即单向传递。

用引用做形参

·引用(&)是标识符的别名

·引用定义格式:

类型 &引用名( 变量名 );

或类型 &引用名=变量名;

·例如:

        int i,j;int &ri=i;//建立一个int型的引用ri,并将其      //初始化为变量i的一个别名j=10;ri=j;//相当于 i=j;

·声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象。

·一旦一个引用被初始化后,就不能改为指向其它对象。

·引用可以作为形参 void swap(int& a, int& b) {...}

·引用作函数形参时,调用函数的实参要用变量名

将实参变量名赋给形参的引用,相当于在被调用函数中使用了实参的别名

特点:

在被调用函数中,对引用的改变,实质就是直接改变实参的变量值

·引用调用起到传址调用的作用,但它又比传址调用更方便、更直接

内联函数声明与使用

1,声明时使用关键字 inline。

2,编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。

注意:

3,·内联函数体内不能有循环语句和switch语句。

·内联函数的声明必须出现在内联函数第一次被调用之前。

·对内联函数不能进行异常接口声明。

默认形参值的作用

~

函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先给出的默认形参值。

~

默认形参值的说明次序

1,默认形参值必须从右向左顺序声明,并且在默认形参值的右面不能有非默认形参值的参数。因为调用时实参取代形参是从左向右的顺序。

·例:

    int add(int x,int y=5,int z=6); //正确int add(int x=1,int y=5,int z); //错误int add(int x=1,int y,int z=6); //错误

默认形参值与函数的调用位置

1,调用出现在函数体实现之前时,默认形参值必须在函数原形中给出;而当调用出现在函数体实现之后时,默认形参值需在函数实现时给出。

·例:

#include <bits/stdc++.h>
using namespace std;
int add(int x=5,int y=6){return x + y;
}
int main()
{   add(); //调用在实现后
}
int add(int x=5,int y=6);
int main()
{   add(); //调用在实现前
}
int add(int x,int y){   return x+y;   
}

默认形参值的作用域

1,在相同的作用域内,默认形参值的说明应保持唯一,但如果在不同的作用域内,允许说明不同的默认形参。

·例:

int add(int x=1,int y=2);
int main()
{  int add(int x=3,int y=4);add();  //使用局部默认形参值(实现3+4)
}
void fun(void)
{   ...add();  //使用全局默认形参值(实现1+2)
}

重载函数的声明

1,C++允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。

·例:

int add(int x, int y);
float add(float x, float y);
//形参类型不同
int add(int x, int y);
int add(int x, int y, int z);
//形参个数不同

c++系统函数

1,C++的系统库中提供了几百个函数可供程序员使用。

·例如:求平方根函数(sprt)、求绝对值函数(abs)等。

2,使用系统函数时要包含相应的头文件。

·例如:math.h 或 cmath


以上如有侵权,请联系,将删除。

制作不易,点个赞吧!


http://chatgpt.dhexx.cn/article/C7AJia4P.shtml

相关文章

c语言中函数调用的过程

一.程序在内存中的占用。 要学习C语言中函数调用的过程&#xff0c;必须要知道程序在内存中各个区域的分布。 C语言的函数调用的过程主要分布在栈中&#xff0c;所以我们今天主要研究栈。 二.几个基本的汇编指令。 call&#xff1a;1.将当前指令的下一条指令的地址保存到栈中…

函数定义和调用

<1>定义函数 定义函数的格式如下&#xff1a; def 函数名(): 代码 demo: 定义一个函数&#xff0c;能够完成打印信息的功能 def printInfo(): print(’------------------------------------’) print(’ 人生苦短&#xff0c;我用Python’) print(’----------------…

Shell函数调用

文章目录 一.函数基本格式二.函数调用2.1函数中调用2.2函数调用函数2.3外部调用2.4案例 三.总结 在shell脚本中&#xff0c;有些命令或者某些操作需要频繁的使用时&#xff0c;每次都重新写太过繁琐&#xff0c;这时我们就可以使用函数&#xff0c;当需要使用时&#xff0c;直接…

类的函数调用

父类和子类的函数调用 1.用指针&#xff08;引用&#xff09;调用函数的时候&#xff0c;被调用的函数取决于指针&#xff08;引用&#xff09;的类型&#xff1b; 2.涉及多态性时&#xff0c;采用虚函数和动态绑定&#xff0c;函数调用在运行时绑定&#xff0c;而非在编译时…

函数调用栈分析

进程在虚拟地址空间的布局 操作系统把磁盘上可执行文件加载到内存运行之前, 需要做很多工作, 其中很重要的一件事就是把可执行文件中的代码, 数据存放到内存 中合适的位置, 并分配和初始化程序运行过程中必须的堆栈, 所有准备工作完成之后操作系统才会调度程序起来运行. 进程…

C语言的函数调用过程

C语言的函数调用过程 先上一段代码 #include<stdio.h> int Add(int x, int y) {int z 0;z x y;return z; } #include <stdio.h> int main() {int a 10;int b 20;int c Add(a, b);return 0; } 123456789101112131415 这个函数计算两个数的值。接下来我们通…

C--函数调用

C函数的调用约定 编译器实现函数调用时所遵循的一系列规则称为函数的“调用约定&#xff08;Calling Convention&#xff09;” 对于C语言来说&#xff0c;运行在X86-64平台上的编译器基本都会根据操作系统的不同选择使用几种常见的调用约定。例如&#xff0c;在wiindows下通常…

C语言 函数调用的过程

例题&#xff1a;求两个整数中的较小者&#xff0c;用函数调用实现。 【代码实现】 int Min(int x, int y) {if (x < y){return x;}elsereturn y; } int main() {int Min(int x, int y);int a, b, c;printf("输入两个要比较的整数&#xff1a;\n");scanf("%…

函数调用的过程分析

一、函数调用机制 局部变量占用的内存是在程序执行过程中”动态”地建立和释放的。这种”动态”是通过栈由系统自动管理进行的。当任何一个函数调用发生时,系统都要作以下工作: 1)建立栈帧空间;2)保护现场: 主调函数运行状态和返回地址入栈&#xff1b;3)为被调函数传递数据(…

C/C++ 函数调用是如何实现的?

一、写在前面的话 C/C 函数调用方式与栈原理是 C/C 开发必须要掌握的基础知识&#xff0c;也是高级技术岗位面试中高频题。我真的真的真的建议无论是使用 C/C 的学生还是广大 C/C 开发者&#xff0c;都该掌握此回答中所介绍的知识。 如果你看不懂接下来第二部分在说什么&#…

函数调用过程

今天突然看到有人私信我说一直没写函数调用过程&#xff08;栈帧的形成和销毁过程&#xff09;这篇博文&#xff0c;赶紧补上。 刚看的栈帧内容时&#xff0c;我很迷惑&#xff0c;我觉得栈帧创建和销毁很麻烦&#xff0c;几句话根本说不完&#xff0c;而且我好像描述不清楚他…

浅谈函数调用!

导语 | 在任意一门编程语言中&#xff0c;函数调用基本上都是非常常见的操作&#xff1b;我们都知道&#xff0c;函数是由调用栈实现的&#xff0c;不同的函数调用会切换上下文&#xff1b;但是&#xff0c;你是否好奇&#xff0c;对于一个函数调用而言&#xff0c;其底层到底…

函数调用流程

函数调用模型 1. 函数调用流程函数调用流程分析函数参数调用代码分析自右向左入栈顺序的优点 2. 调用惯例函数参数的传递顺序和方式栈的维护方式调用管理表 3. 函数变量传递分析分析图 1. 函数调用流程 栈(stack)是现代计算机程序里最为重要的概念之一&#xff0c;几乎每一个程…

函数调用栈

函数调用栈 我们在编程中写的函数&#xff0c;会被编译器编译为机器指令&#xff0c;写入可执行文件&#xff0c;程序执行的时候&#xff0c;会把这个可执行文件加载到内存&#xff0c;在虚拟地址空间中的代码段存放。 如果在一个函数中调用另一个函数&#xff0c;编译器就会…

函数调用和使用

1.函数是什么 函数&#xff08;Function&#xff09;能实现的功能从简单到复杂&#xff0c;各式各样&#xff0c;但其本质是相通的&#xff1a;“喂”给函数一些数据&#xff0c;它就能内部消化&#xff0c;给你“吐”出你想要的东西。 2.定义和调用函数 2.1 定义函数 #…

C语言——函数的调用

函数的调用 传值调用 函数的形参和实参分别占有不同的内存块&#xff0c;对形参的修改不会影响实参。 传址调用 1.传址调用是把函数外部创建的变量的内存地址传递给函数参数的一种调用函数的方式 2.这种传参方式可以让函数和函数外边的变量建立起真正的联系&#xff0c;也就…

C语言之函数调用

C语言之函数调用 “温故而知新&#xff0c;可以为师矣”&#xff01; 让我们开启函数的道路吧&#xff01; 今天主要讲函数的调用方式&#xff01; 在讲之前&#xff0c;先回顾一下实际参数和形式参数的区别&#xff1b; 1.在定义函数时函数名后面括号中的变量名称为“形式参数…

C语言函数的调用

函数调用&#xff08;Function Call&#xff09;&#xff0c;就是使用已经定义好的函数。函数调用的一般形式为&#xff1a; functionName(param1, param2, param3 ...);functionName 是函数名称&#xff0c;param1, param2, param3 …是实参列表。实参可以是常数、变量、表达…

Windows编程-001

如果建立的是Win32控制台工程&#xff08;入口函数是main函数&#xff09;的话&#xff0c;WinMain函数不能作为入口函数&#xff0c;如果想要解决这个问题的话&#xff0c;可以打开项目属性->链接器->系统->子系统&#xff0c;把子系统对应的“控制台”改为“窗口”。…

windows全系1

windows操作系统专贴(一定有你想要的) 2006年12月01日 22:25 windows 98 简体中文零售版第三版 语言&#xff1a;简体中文 类型&#xff1a;操作系统 大小&#xff1a;180MB 环境&#xff1a;9x/Me/NT/2000/XP/.Net/ 授权&#xff1a;零售版 软件介绍:这个版本是SE的改进版,比前…