zoukankan      html  css  js  c++  java
  • C++对c中函数的拓展,函数重载

    函数参数的拓展

    inline内联函数

    最好 小的函数都写成内联函数, 写上inline 编译器不一定内联,

    C++中推荐使用内联函数替代宏代码片段
            C++中使用inline关键字声明内联函数
            内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求。
    宏替换和函数调用区别
    结论:
    1)内联函数在编译时直接将函数体插入函数调用的地方
    2)inline只是一种请求,编译器不一定允许这种请求
    3)内联函数省去了普通函数调用时压栈,跳转和返回的开销 
    最好 小的函数都写成内联函数, 写上inline 编译器不一定内联,
    View Code

    默认参数

    函数默认参数的规则
    只有参数列表后面部分的参数才可以提供默认参数值
    一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数值
    传参时:print(1,2); 后面的不写就是默认的,写的话就按照写的
    在类的构造函数中常用来这样写
    void print(int a, int b, int x = 3, int y=4, int z = 5)
    {
        printf("x:%d
    ", x);
    }

    函数重载

    什么是函数重载

    用同一个函数名定义不同的函数
    当函数名和不同的参数搭配时函数的含义不同
    函数重载发生在同一个类中

    函数重载的好处

    函数重载的条件

    • 函数名称必须相同。
    • 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
    • 函数的返回类型可以相同也可以不相同。
    • 仅仅返回类型不同不足以成为函数的重载。


    注意函数的返回值不做为重载的条件
    void myPrint(int a)
    {
        cout << "a = " << a << endl;
    }
    
    void myPrint(char *p)
    {
        cout << "p = " << p << endl;
    }
    
    void myPrint(int a, int b)
    {
        cout << "a = " << a  << "b = " << b << endl;
    }
    重载例子

    重载的规则,和注意事项

    编译器调用重载函数的准则
    将所有同名函数作为候选者
    尝试寻找可行的候选函数
    精确匹配实参
    通过默认参数能够匹配实参
    通过默认类型转换匹配实参
    匹配失败
    最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。
    无法匹配所有候选者,函数未定义,编译失败。

    函数重载的注意事项
    重载函数在本质上是相互独立的不同函数(静态链编)
    重载函数的函数类型是不同的
    函数返回值不能作为函数重载的依据
    函数重载是由函数名和参数列表决定的。

    函数重载是发生在一个类中里面

    当函数重载遇上默认参数

    void fun(int a) { cout << "a" << endl; } void fun(int a, char c='a') { cout << "a c"<<endl; } int main() { fun(1); // 二义性报错 return 0; }

    当函数重载遇到const, reference , 指针 重点

    普通重载(加上const也不可以), 引用和引用(常量和非常量可以),指针和指针(常量和非常量可以),引用和指针(都可以)

    普通const, 二义性

    void fun(const int a)
    {
        cout << "a" << endl;
    }
    void fun(int a)
    {
        cout << "a "<<endl;
    }
    int main()
    {
        fun(1); // 二义性报错
        return 0;
    }
    普通const

    const指针和普通指针 可以重载

    void fun(const int *a) 常
    void fun(int *a)可以重载
    但是int * const a 不能与int*a
    //const 指针
    void fun(const int *a) 
    {
        cout << "const int b  = 20 调用时形参:const int *a" << endl;
    }
    void fun(int *a)
    {
        cout << "int a = 10 调用时形参: int *a"<<endl;
    }
    int main()
    {
        int a = 10;
        fun(&a);
        const int b = 20;
        fun(&b);
        cout << "可以重载"<<endl;
        return 0;
    }
    指针和普通指针

    const引用(常量引用)和const指针一样可以

    引用和引用

    void fun(const int &a) 和 void fun(int &a)可以重载
    引用和指针
    void fun(int &a) 和 void fun(int *a)可以重载, 加上const也可以,因为本来就是两种不同类型


    // 重载 重写重定义
    // 重写发生在两个类之间
    // 重载必须在一个类之间

    // 重写分为两类
    // 1虚函数重写 将发生多态
    // 2非虚函数重写 (重定义)

    后面写

  • 相关阅读:
    01
    商城管理系统
    10
    09
    08
    07(3)
    07(2)
    07
    06
    jsp第一次作业
  • 原文地址:https://www.cnblogs.com/xiaokang01/p/9163278.html
Copyright © 2011-2022 走看看