史上最详细的C++函数讲解

时间:2018-11-16
本文章向大家介绍史上最详细的C++函数讲解,需要的朋友可以参考一下


函数
printf 输出的函数
scanf 输入的函数
函数是什么 怎么写
是一组一起执行一个任务的语句
一个程序的基本组成单位是函数
只需要知道函数名字和括号里面要填的内容 就可以调用函数
1、如果代码中有重复的语句--->写成函数 可以缩短代码量 提高效率
2、用的时候知道函数名+参数 直接调用 有问题时 只需要检查单个函数

int main()
int 函数类型/返回值类型
main 函数名字
() 里面要写参数 如果里面不写 表示没有参数 或者写void 都表示没有参数
{} 里面是函数体
return 跳出这个函数 后面如果有值 称之为返回值
如果返回值类型void return 后面可以不加内容也可以省略return
return 后面的值由前面的函数类型决定
void main()
{
return;//后面不需要加值 或者可以省略
}
void 表示空 1、放在函数名前面(返回值类型) 表示函数没有返回值
2、放函数()里面 表示函数没有参数
比较常用的函数 (一般情况下是看不到函数体的)
void outtextxy(int x,int y,LPCTSTR str);
1、知道怎么用 函数+参数调用 函数作用
2、返回值 返回值作用
stecmp 比较两个字符是否相等
malloc 申请内存 返回申请的内存的首地址

定义函数的时候--->函数()里面的是参数 int a,int b
调用的函数的时候 函数括号里面的参数is_Max(x,y,z) 实参
形参 定义时候的参数 自己取的名字 函数内部使用的参数
实参 指实际参数 在调用函数的时候用的参数 可以使变量可以使常量 作用是将一个值传递给形参
实参与形参只是赋值的关系
调用时 是把实参的值赋给了形参
修改形参时,并不会影响实参
从主函数(main)开始 从上往下
遇到调用函数的位置 用实参给形参赋值 调用之后return到调用的位置
继续往下执行

形参的值不会影响实参
通过传递地址的方式,修改主函数的变量、数组(指针的作用之一)

调用之前先定义函数-->直接定义
如果是在调用之后定义的函数 必须在前面刷存在感(就是将定义的函数放在主函数之后时,在调用的时候提前声明)

返回值+函数名+参数

代码:
1、头文件
2、类型定义,全局变量
3、函数声明
4、主函数
5、函数定义

关于函数声明 函数定义中的形参名字 (如果有的话)必须保持一致
声明 刷存在感 (声明中的 参数名字可以省略不写

递归 和函数参数的写法

作用域
变量作用域 生存周期
{} if for 函数{}
在{}定义的变量 出了{}不能用 {}作用域

1、全局变量 函数外部定义 作用域 作用于整个文件 生存周期 程序运行时间
2、局部变量 {}定义 作用域只作用于{]里面 生存周期 出了{}自动回收
3、静态变量 statie修饰的变量 生存周期 通全局变量
作用域 看它定义的位置
stayic 静态变量 只会定义一次 下一次接着上一次的值继续使用

测试代码:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #if 0
  4 /*设计一个函数
  5 1、确定函数的功能 例如 比较三个数字那个最大
  6 2、取函数名字 不能和已有的标识符 关键字 函数重名
  7 is_Max(a,b,c) 参数 确定顺序 确定个数 参数类型
  8 3、返回值 可以先写void
  9  //is_Max(a,b,c)
 10  参数 确定顺序 确定个数 参数的类型
 11  调用的时候()里面可以使变量 页可以是常量
 12 
 13 */
 14 int is_Max(int a,int b,int c)
 15 {
 16     //c = 22;
 17     if (a > b)
 18     {
 19         if (a > c)
 20         {
 21             //printf("a最大");
 22             return a;//可以返回一个值 最大值
 23         }
 24         else
 25         {
 26             return c;//有返回值 前面函数类型要对应为int
 27         }
 28     }
 29     else
 30     {
 31         if (b > c)
 32         {
 33             return b;
 34         }
 35         else
 36         {
 37             return c;
 38         }
 39     }
 40 
 41     //return;
 42 }
 43  //自定义函数 可以写在主函数体之前 或者之后 
 44  //写在主函数之前在主函数里面调用的时候可以直接调用
 45  //写在主函数之后在主函数里面调用的时候需要在主函数值前进行函数声明
 46 #endif
 47 
 48 int x;//全局变量 作用域 作用于整个文件 生存周期程序运行时间
 49 
 50 
 51 void swapint(int a, int b)
 52 {
 53     int temp = a;
 54     a = b;
 55     b = temp;
 56     printf("函数里面a=%d,b=%d\n",a,b);
 57 }
 58 void swapPoint(int *p, int *q)
 59 {
 60     int temp = *p;
 61     *p = *q;
 62     *q = temp;
 63     printf("主函数中a=%d,b=%d\n",*p,*q);
 64 
 65 }
 66 
 67 void fun()
 68 {//作用域在{}里面 但是出了{}之后不会被系统回收
 69     static int x = 0;//static修饰的变量 定义只定义一次
 70     x++;
 71     printf("%d",x);
 72 }
 73 
 74 
 75 
 76 
 77 int main()//主函数
 78 {
 79     ////代码
 80     //printf("hello");//有参数的函数
 81     ////1、int *p = (int*)malloc(sizeof(int));//返回值 返回被调用的函数 返回值赋值给p
 82     //int t=is_Max(1, 2, 3);//函数调用 返回值是int 定义一个int变量来接收
 83     ////is_Max 把1的值赋给了a 把2值赋给了b 然后把3值赋给了c  
 84     //printf("%d",is_Max(1,2,3));
 85     //int x = 1, y = 2, z = 3;
 86     //is_Max(x, y, z);
 87     //printf("hello");//有参数的函数
 88 
 89     int a = 2, b = 3;
 90     swapint(a, b);//通过函数交换ab的值
 91     printf("主函数中a=%d,b=%d",a,b);
 92     swapPoint(&a, &b);
 93     printf("主函数中a=%d,b=%d\n",a,b);
 94     
 95     //if (1)
 96     //{
 97     //    int myint;
 98     //    myint = 1;
 99     //}
100     ////myint = 1;  不可用
101     fun();
102     fun();
103     fun();
104     
105     
106     getchar();//没有参数的函数
107     return 0;
108 }

附:

形参和实参

函数

//class 1-------------------------------------------------------------------------------------------------------------------------------------//

  • 函数    一组一起执行一个任务的语句   是程序的基本单位
    • 函数作用
      • 封装代码       使用的用户不需要知道函数如何实现 只需要知道函数功能就可以使用
      • 节省代码行数      对于一些需要重复使用的代码段 用函数可以缩短代码 提高编程效率
      •  
    • 函数组成
      • 函数名
        • 函数的名字(自己定义)
        • 调用的时候知道函数名和参数即可调用
      • 函数类型(返回值类型)
        • 定义的时候写在函数前面的类型 函数后面return后面的类型一致
        • 如果函数不返回任何值 返回类型写void return后面不写任何值(也可以省略return)
      • 参数
        • 函数括号中的内容称之为参数 调用的时候需要传递值进去
      • 函数体
        • 函数具体执行内容的语句
    • 函数的定义和使用方式
      • 函数定义  提供了函数的实际主体(必须有)
      • 函数使用  调用函数的方式 函数名(参数)
      • 函数声明  函数如果在调用之后定义 需要加上函数声明
        • 函数声明一般放前面  包含函数类型 函数名和参数类型(参数名可以省略)
        • 形参和实参
          • 形参      函数在定义时候括号中的参数称之为形参
          • 实参      函数在调用的时候括号中的参数称之为实参
          • 形参和实参可以同名 但是并不是同一个变量 不占同一块内存 修改形参并不会影响实参    形参不改变实参
          • 通过指针可以直接通过地址修改调用函数中的变量

//class 2-----------------------------------------------------------------------------------------------------------------------------------//

  • 递归
    • 函数在函数定义的时候调用本身(自己直接或者间接调用自己)称之为递归
    • 优点
      • 少量代码即可描述出一个需要重复计算的问题
      • 循环能实现的递归都能实现,但是递归能实现的,循环未必能实现
    • 缺点
      • 相当于其他常用方法(比如循环)效率较低
      • 每次调用都会为参数和返回值开辟栈区内存 递归次数过多容易引发栈溢出
  • 注意事项
    • 作用域
      • 在{}内部定义的变量都是局部变量 作用域只在这个{}中(比如函数中 或者if和for的括号中)
      • 在{}外部定义的是全局变量  全局变量可以使用在定义之后的任何函数中
      • 不同作用域之间的变量允许同名 不会重定义
      • 有多个不同作用域之间的同名变量 使用的是最近定义的一个在作用域内的变量(就近原则)
    • 命名规则
      • 函数名命名规则同变量命名规则
      • 只能数字字母下划线组成 不能用其他字符 不能使用关键字
    • 函数定义和函数声明要保持一致 返回值类型  函数名 参数(如果声明中有形参名字 这个要和定义的时候保持一致)
    • 函数的形参不能改变实参
  • 了解
    • 指针函数  返回值为指针的函数   比如strcpy  strcat返回的都是指针  malloc
    • 函数指针  指向函数的指针
      • 一般用于传递函数名作为参数的情况
      • 写法  比如int fun(int x)--->对应的函数指针  int (*pfun)(int)函数名换成(*pfun)就行
      • 函数指针赋值后使用方式同函数名一样