C++笔记之函数

这篇博客详细介绍了C++中的函数,包括函数的基本知识、参数传递、函数指针、内联函数、引用变量、默认参数、函数重载和函数模板。讲解了函数的定义、原型和调用,深入探讨了按值传递、数组、结构、字符串的传递方式,以及函数指针的使用。还讨论了内联函数的优势和限制,引用作为参数的特点,以及如何使用默认参数和函数重载。最后,介绍了函数模板的概念和显式具体化,解释了编译器如何进行重载解析。
摘要由CSDN通过智能技术生成

使用C++函数时需要提供的内容:
1)函数的定义
2)函数原型
3)函数调用

一、函数基本知识

1、函数的定义
函数的定义分为有返回值和无返回值两种,无返回值函数称为void函数,格式:

void functionName(parameterList)
{
   
	statement(s);
	return;  //可选
}

有返回值:

typeName functionName(parameterList)
{
   
	statement(s);
	return value;  //必须
}

返回值可以是常量、变量、表达式,其返回的类型必须是typeName类型或者可以转换为typeName的类型。返回值可以是除数组外任何类型(整型、浮点型、指针、结构、对象),C++虽不允许直接返回数组,但允许数组作为结构或对象的一部分来返回。
2、函数原型
作用:告诉编译器函数返回类型、参数类型和数量。
原型是一条语句以分号结束,原型中不必提供变量名,只需有类型列表即可(意味着原型中的变量名不必与定义中的名字相同,但类型需要一致)。

#include <iostream>

int sum(int,int); // #1
int main()
{
   
    using namespace std ;
    int a ,b;
    cin >>a >> b ;
    a = sum(a,b); // #2
    cout << a ;
    return 0 ;

}
/************#3***********/
int sum(int c,int e)
{
   
    int sum1;
    sum1 = c + e ;
    return sum1 ;
}

如上述代码中,#1为函数原型,#2为函数调用,#3为函数定义。

二、函数参数传递

1、按值传递
顾名思义,就是在函数调用的时候将数值传递给函数,在此过程中以上述sum函数为例,在#2处调用时,程序将main函数中的变量a ,b 的数值传递给sum参数列表中的变量c,e,相当于将变量a,b的值复制一份给c,e,所以变量a,b的称为实参,而变量c,e称为形参
在函数内部声明的变量称为局部变量(包括函数的参数),在函数退出的时候局部变量所占用的内存会自动释放。
2、将数组传递给函数

#include <iostream>

int sum(int arr[],int); // #1
int main()
{
   
    using namespace std ;
    int arr1[5] = {
   21, 25, 56, 14,19};
    int a ;
    a = sum(arr1,5); // #2
    cout << a ;
    return 0 ;

}
/************#3***********/
int sum(int arr[],int b)
{
   
    int arr_sum = 0;
    for (int i = 0 ;i < b ; i++ )
    {
   
        arr_sum += arr[i];
    }
    return arr_sum;
}

以上代码为例,在sum函数中第一个参数 int arr[ ] ,并不表示一个数组(所以也不会将实参复制一份),而是一个指针等价于 int * arr(两者只在函数头或函数原型中等价,在其他地方两者的含义并不相同) ,但在函数中使用时可以将其视为数组使用,如上sum函数一样。
同时在调用sum函数时,传递给函数的是数组名,数组名表示数组中第一个元素的地址,对数组名使用sizeof可以得到数组的长度(以字节为单位),所以实质上main函数中传递给sum函数的第一个参数是arr数组的地址给sum函数,同时意味着sum函数可以修改main中定义的arr数组(原始数组),若不想让函数修改原始数组可以在函数原型和定义的地方加上const如:int sum (const int arr[], int b ),这意味着arr是常量不能通过arr去修改数组内部的值,但原始数组可以不是常量。
3、指针与const
指针与const的组合有两种不同的方式
1)、是让指针指向一个常量对象,以防止通过指针去修改所指向的值,但可以改变指针所指向的位置
2)、是让指针本身成为一个常量,以防止改变指针所指向的位置,但可以通过指针去修改所指向的值

//#1
int a = 12;
const int * p1 = &a ;
//#2
int * const p2 = &a ;

上述中#1是第1种情况,让指针指向一个常量对象,不能通过指针去修改a所在位置的值,但可以通过变量a去修改其值
#2是第2种情况:让指针本身成为一个常量,p2只能指向a所在的位置,不能指向其他位置。
同时C++禁止将const的地址赋给非const指针,所以下述情形是不允许的:

cons int b = 23 ;
int *p = &b ; //不允许

4、在函数中使用二维数组
如下示例所示:

int arr1[2][3] = {
   {
   1,2,3},{
   23,25,15},{
   35,89,45}};
int sum(int arr[][3],int size )
{
   
	int total = 0;
	for(int i = 0; i < size ; i ++ )
	{
   
		for(int j = 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值