• 高放的c++学习笔记之函数基础


    局部变量

    函数里面的局部变量有普通的局部变量局部静态变量两种。

    普通局部变量变量就是正常定义在函数体内部的变量,如果返回局部变量的地址,以便于函数调用结束后还继续访问此变量的话,编译器会报warning,本身这种行为也是错误的,因为函数调用结束后此变量的内存会被释放掉。

    局部静态变量会在第一次定义的时候赋给一个初值,之后的调用过程中值会保持原来的值。

    例如

    int print(){
      static int a = 1;
      printf("%d ", a++);
    }

    参数传递

    总结出以下几种原则

    1.如果是正常传参的话,规则与赋值相等。

    2.如果是传引用的话

    (1)正常引用传参必须满足匹配原则,例如形参是int,那么传递参数就只能是int,而不能是double或const int。

    (2)常量引用传参能够传递所有非常量的匹配的参数,也能传递所有const 类型的匹配参数(如表达式的值,函数的返回结果等。

    3.指针传参

    具体有const int a, int const a, const int *a

    (1)const int a, int const a 正常指针没啥说的。

    (2)int * const a, 指针常量,指针指向的地址不能变,但是地址所具有的值可改变。

    (3)const int * a,a指针所指向地址能改变,但指向地址的内容不能改变

    (4)数组传参如果形参是例如int a[10],传过去的并不是数组,只是指向数组首地址的指针。如果使用memset的话只会让指针指向的位置置零。

      int *matrix[10];         //十个指针构成的数组

      int (*matrix)[10]        //指向含有十个整数的数组的指针

      二维数组传参的时候一定要指定第二维的个数

    函数重载匹配规则

    具有相同变量名和不同的参数列表的函数叫做重载函数

    (1).const T和T不能作为区别两个重载函数的参数

    (2)编译器会选择最优匹配的函数调用

    最优匹配会经过如下几个步骤

    ⊙1.确定候选函数

    候选函数有两个特征

      ①声明在调用点可见

      ②函数名与调用函数名相同

    ⊙2.寻找可行参数

    可行参数寻找的原则有两点

      ①形参数量与实参数量匹配

      ②形参类型与实参类型相同或能相互匹配

    ⊙3.寻找最优匹配

    最有匹配函数需满足两点

      ①该函数每个实参的匹配都不劣与其他可行参数的匹配

      ②至少有一个实参的匹配优于其他可行参数

      ③如果满足不了以上两点编译器将会判为二义性报错

    默认实参

    某些函数有这样一些参数,在函数调用的过程中很多次都被赋予同样的值,此时往往把这个参数设为默认参数。

    默认参数的写法如下

    void print(int a = 1){};

    默认参数定义有以下几种规则

    (1)某一个参数被赋予了默认值那么之后的参数也要被赋予默认值

    默认参数声明有以下几种规则

    内联函数

    当函数体很短且易展开的时候,我们将函数前面加上一个inline如果能够展开编译器会在编译的时候将函数展开成一个表达式,以节省调用的时间。内联函数是一种建议,编译器可能不会理会。

    constexpr函数

    当表达式全是由常量组成的时候,在前面加一个constexpr编译器会直接将这个函数变成一个常量,以节省函数调用及计算过程。

    函数指针

    函数指针指向的是函数而并非是对象

    函数指针声明,与声明函数类似,只是将函数名换成指针,写法如下:

    void (*a)(double, int);

    指向某函数是时方法与赋值类似

    a = print;

    调用该指针时与调用函数方法类似

    a(1., 1);

  • 相关阅读:
    蘑菇街
    康拓展开
    CSS学习笔记
    专业名词
    专业名字
    01背包问题
    将bbr功能合入到centos7.3
    How to Identify User&Password of DataBase safely in SQL statement?
    tips for private constructor
    all Key Word of C#
  • 原文地址:https://www.cnblogs.com/icodefive/p/4921649.html
Copyright © 2020-2023  润新知