C++ 函数 01:函数原型、函数签名、函数定义、函数参数传递方式

文章详细介绍了C++中的函数原型,它是函数声明的语法形式,包含返回类型、函数名和参数列表,用于编译器的类型检查。函数签名不包含返回类型,是区分不同函数的关键。此外,文章还讨论了函数定义、函数签名的区别以及值传递、引用传递和指针传递这三种参数传递方式在C++中的应用。
摘要由CSDN通过智能技术生成

function 函数 01:函数原型、函数签名、函数定义、函数参数传递方式

git:https://github.com/weichangk/hellocpp/tree/master/function

函数原型

C++函数原型指的是函数声明的语法形式,它告诉编译器函数的名称、返回类型和参数列表。函数原型的语法形式如下:

return_type function_name(parameter_list);

其中,return_type 是函数返回值的数据类型,function_name 是函数的名称,而 parameter_list 是函数参数的列表,包括参数的数据类型和名称。例如,下面是一个简单的 C++ 函数原型的例子:

int sum(int a, int b);

这个函数的名称是 sum,它有两个 int 类型的参数 a 和 b,它的返回值类型是 int。函数原型只是告诉编译器函数的存在和形式,不需要函数体的实现。函数的实现可以在其他地方定义。

函数原型的作用是让编译器知道函数的存在和形式,这样在程序中调用函数时,编译器就可以进行参数类型检查和类型转换,以及对函数返回值的处理。函数原型还可以帮助程序员在程序中使用多个源文件时避免函数名称冲突的问题。

函数定义

C++函数定义是指在函数原型的基础上,为函数添加函数体实现的过程。函数定义通常包括函数头和函数体两部分。
函数头指的是函数的声明,包括函数的返回类型、函数名称和参数列表。函数头的语法形式如下:

return_type function_name(parameter_list)

函数体指的是函数的实现代码,它包含了函数要执行的操作和语句。函数体的语法形式如下:

{
  statement1;
  statement2;
  ...
  return expression;
}

下面是一个简单的 C++ 函数定义的例子:

int sum(int a, int b)
{
  int result = a + b;
  return result;
}

函数签名

C++函数签名指的是函数的名称、参数类型和参数个数的组合形式,它是用来区分不同函数的重要标识。函数签名是由函数的名称和参数列表中参数类型的组合构成的,不包括函数返回类型。例如,下面是两个函数的例子:

int sum(int a, int b);
float sum(float a, float b);

这两个函数都叫做 sum,但它们的参数类型和个数不同,因此它们的函数签名也是不同的。第一个函数的函数签名是 sum(int, int),第二个函数的函数签名是 sum(float, float)。

C++编译器在编译时会通过函数签名来识别不同的函数,并为每个函数生成一个唯一的符号来进行链接。因此,在C++中,函数签名对于函数的调用和链接都是非常重要的。

需要注意的是,C++中允许函数重载,即同名函数可以有不同的参数列表,这些函数的函数签名也是不同的。

函数原型和函数签名的区别

C++函数原型和函数签名都描述了函数的形式,但是它们的意义和用途是不同的。

函数原型指的是函数声明的语法形式,它告诉编译器函数的名称、返回类型和参数列表。函数原型的作用是让编译器知道函数的存在和形式,以便在程序中调用函数时进行参数类型检查和类型转换,以及对函数返回值的处理。

函数签名是由函数的名称和参数列表中参数类型的组合构成的,不包括函数返回类型。函数签名用来区分不同函数的重要标识,编译器在编译时会通过函数签名来识别不同的函数,并为每个函数生成一个唯一的符号来进行链接。

因此,函数原型和函数签名都是描述函数形式的重要元素,但它们的作用和用途是不同的。函数原型用来声明函数的形式,让编译器知道函数的存在和形式,而函数签名则用来区分不同函数的重要标识,让编译器在编译时能够正确识别和链接不同的函数。

函数参数传递方式

在 C++ 中,有三种不同的参数传递方式:值传递、引用传递和指针传递。

  1. 值传递:函数的形参是基本数据类型或对象,函数调用时,实参的值会被复制一份,传递给函数形参,函数对形参的修改不会影响实参的值。

    void changeValue(int n) {
      n = 100;
    }
    void func01() {
      int a = 10;
      changeValue(a);
      cout << a << endl; // 输出 10
    }
    
  2. 引用传递:函数的形参是引用类型,函数调用时,实参的引用会被传递给函数形参,函数对形参的修改会影响实参的值。

    void changeValueByRef(int& n) {
      n = 100;
    }
    void func02() {
      int a = 10;
      changeValueByRef(a);
      cout << a << endl; // 输出 100
    }
    
  3. 指针传递:函数的形参是指针类型,函数调用时,实参的地址会被传递给函数形参,函数可以通过指针修改实参的值。

    void changeValueByPtr(int* n)
    {
      *n = 100;
    }
    void func03()
    {
      int a = 10;
      changeValueByPtr(&a);
      cout << a << endl; // 输出 100
    }
    

需要注意的是,使用指针或引用传递参数可以避免因为拷贝大量数据而导致的性能问题。当函数的参数是复杂的对象时,建议使用引用或指针传递参数,以提高程序的效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值