C++ 函数 01:函数原型、函数签名、函数定义、函数参数传递方式
创始人
2024-05-31 14:26:40
0

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
    }
    

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

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...