C++重新入门-C++ 函数

函数是一组一起执行一个任务的语句。每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。

您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。

函数声明 告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。

C++ 标准库提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置。

函数还有很多叫法,比如方法、子例程或程序,等等。

1.函数定义

函数头

函数头包括函数的返回类型、函数名、参数列表等信息。

cpp 复制代码
return_type function_name(parameter_list) {
    // 函数体
}
  • return_type 是函数返回的数据类型,它指定了函数执行后的返回值类型。如果函数不返回任何值,可以使用 void
  • function_name 是函数的名称,它用于在程序中唯一标识函数。
  • parameter_list 是函数的参数列表,包括参数的数据类型和名称。如果函数不接受任何参数,则参数列表为空。

函数体

函数体包含了函数的实际操作内容。

cpp 复制代码
return_type function_name(parameter_list) {
    // 函数体,包括对参数的处理、各种语句的执行等
    // 通常包括一个 return 语句来返回结果
    return result;
}
  • 函数体是函数的实际执行代码,包括对参数的处理、各种语句的执行等。
  • 在函数体中,通常包含一个 return 语句,用于返回函数的结果。如果函数返回类型为 void,则可以省略 return 语句,或者使用 return; 来提前结束函数执行。

示例

以下是一个简单的函数定义示例,用于计算两个整数的和:

cpp 复制代码
#include <iostream>

// 函数定义
int add(int a, int b) {
    int sum = a + b; // 计算两个整数的和
    return sum;      // 返回计算结果
}

// 主函数
int main() {
    int x = 5;
    int y = 3;
    int result = add(x, y); // 调用函数 add,并将返回值赋给 result
    std::cout << "The sum of " << x << " and " << y << " is " << result << std::endl;
    return 0;
}

在这个示例中,add 函数接受两个整数参数 ab,计算它们的和,并将结果返回。在 main 函数中,我们调用 add 函数,并将返回的结果输出到控制台。

总之,函数定义是 C++ 程序中的重要组成部分,用于封装和组织代码,提高代码的复用性和可维护性。

2.函数声明

C++ 函数声明指的是在程序中提前声明函数的名称、参数列表和返回类型,但不包括函数体。函数声明的目的是为了让编译器知道在后面的代码中会用到这个函数,以便在编译时能够进行类型检查和语法分析。

函数声明包括函数名称、参数列表和返回类型。一般情况下,函数声明的形式如下:

cpp 复制代码
return_type function_name(parameter_list);
  • return_type: 指定函数返回值的类型,可以是任何有效的 C++ 数据类型,包括基本数据类型、自定义数据类型(类、结构体等),或者 void 表示函数没有返回值。
  • function_name: 函数的名称,用于在其他地方调用该函数。
  • parameter_list: 函数的参数列表,包括参数的类型和名称。如果函数不需要参数,则可以省略参数列表,或者使用 void 关键字表示没有参数。

下面是一个简单的函数声明示例:

cpp 复制代码
int add(int a, int b); // 声明一个名为 add 的函数,该函数接受两个 int 类型的参数,并返回一个 int 类型的值
void greet();           // 声明一个名为 greet 的函数,该函数不接受任何参数,也没有返回值

在函数声明中,不需要提供函数的实现(函数体),只需要提供函数的签名(名称、参数列表和返回类型)。函数的实现可以在稍后的代码中定义。通常,函数的实现应该与其声明匹配,否则会导致编译错误。

函数声明通常可以放在头文件中,以便在多个源文件中共享函数接口。在源文件中,可以包含这些头文件,以便编译器能够识别函数声明并进行相应的类型检查。

函数声明的目的是为了提供函数接口,使得代码模块化,并能够在不同的地方使用相同的函数,从而提高代码的可维护性和可重用性。

3.调用函数

创建 C++ 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。

当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。

调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。例如:

cpp 复制代码
#include <iostream>
using namespace std;
 
// 函数声明
int max(int num1, int num2);
 
int main ()
{
   // 局部变量声明
   int a = 100;
   int b = 200;
   int ret;
 
   // 调用函数来获取最大值
   ret = max(a, b);
 
   cout << "Max value is : " << ret << endl;
 
   return 0;
}
 
// 函数返回两个数中较大的那个数
int max(int num1, int num2) 
{
   // 局部变量声明
   int result;
 
   if (num1 > num2)
      result = num1;
   else
      result = num2;
 
   return result; 
}

把 max() 函数和 main() 函数放一块,编译源代码。当运行最后的可执行文件时,会产生下列结果:

复制代码
Max value is : 200

4.函数参数

如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数

形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。

当调用函数时,有三种向函数传递参数的方式:

默认情况下,C++ 使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的参数。之前提到的实例,调用 max() 函数时,使用了相同的方法。

5.参数的默认值

在 C++ 中,可以为函数的参数提供默认值。这意味着在函数调用时,如果没有提供对应参数的值,那么将会使用默认值。这样做可以使函数调用更加灵活,可以减少代码中函数调用时需要提供的参数数量,同时也可以为函数的参数提供一个合理的默认值。

为函数参数提供默认值的语法是在函数声明或定义中,在参数列表中为希望设置默认值的参数赋值。这些参数必须是参数列表中的最右侧参数,也就是说,不能为中间或左侧的参数提供默认值。

以下是一个简单的示例,演示了如何在 C++ 中为函数参数提供默认值:

cpp 复制代码
#include <iostream>

// 函数声明,参数 x 和 y 有默认值
int add(int x, int y = 0);

int main() {
    int a = 5, b = 3;
    int sum1 = add(a, b); // 调用 add 函数并传递两个参数
    int sum2 = add(a);    // 调用 add 函数并只传递一个参数
    std::cout << "Sum 1: " << sum1 << std::endl;
    std::cout << "Sum 2: " << sum2 << std::endl;
    return 0;
}

// 函数定义
int add(int x, int y) {
    return x + y;
}

在这个示例中,add 函数的第二个参数 y 被赋予了默认值 0。这意味着在调用 add 函数时,如果没有提供第二个参数,将会使用默认值 0。在 main 函数中,有两个 add 函数的调用,其中一个传递了两个参数,而另一个只传递了一个参数。由于第二个参数有默认值,所以即使第二次调用中只传递了一个参数,函数也能够正常工作。

需要注意的是,一旦为参数提供了默认值,那么在调用函数时,可以省略相应位置的参数,但是在函数声明和定义中,必须为所有没有默认值的参数提供类型声明。

相关推荐
UestcXiye6 分钟前
《TCP/IP网络编程》学习笔记 | Chapter 3:地址族与数据序列
c++·计算机网络·ip·tcp
Chrikk6 分钟前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*9 分钟前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue9 分钟前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man12 分钟前
【go从零单排】go语言中的指针
开发语言·后端·golang
霁月风1 小时前
设计模式——适配器模式
c++·适配器模式
萧鼎1 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸1 小时前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农1 小时前
Python 继承、多态、封装、抽象
开发语言·python
^velpro^2 小时前
数据库连接池的创建
java·开发语言·数据库