zoukankan      html  css  js  c++  java
  • C++函数(二)

    函数的重载

    看下面的max函数

    //返回两数间的最大值
    int max (int num1, int num2) {//比较num1和num2
        if (num1 >= num2) {
    return num1;
    } else {
    return num2;
    } }

    如果我们想要比较两个浮点数的最大值,那么我们就不能使用max()这个函数了。可实际上max就是返回最大值的意思,应该实现所有数据类型的比较,这时候就要用到函数重载。

    函数重载,就是改变函数的参数列表而不改变函数名,以实现不同的参数传入。见下面的代码

    #include <iostream>
    
    using namespace std;
    
    //返回两数间的最大值
    int max (int num1, int num2) {
        //比较num1和num2
        if (num1 >= num2) {
            return num1;
        } else {
            return num2;
        }
    }
    
    //返回两数间的最大值
    double max (double num1, double num2) {
        //比较num1和num2
        if (num1 >= num2) {
            return num1;
        } else {
            return num2;
        }
    }
    
    //返回三个数间的最大值
    double max (double num1, double num2, double num3) {
        //比较num1, num2, 选出最大值再和num3比
        return max(max(num1, num2), num3);
    }
    int main()
    {
        cout << "1和3的最大值:" << max(1, 3) << endl;
        cout << "1.1和3.3的最大值:" << max(1.1, 3.3) << endl;
        cout << "1.1和3.3和5.5的最大值:" << max(1.1, 3.3, 5.5) << endl;
    
        return 0;
    }

    缺省参数

    可以给函数参数一个缺省值,在没有参数传入的时候,则缺省值将传递给函数。

    #include <iostream>
    
    using namespace std;
    
    //设置参数缺省值为1
    void printArea(double radius = 1) {
        cout << "area is " << radius*radius*3.14159 << endl;
    }
    int main()
    {
        printArea();
        printArea(4);
        return 0;
    }

    结果:

     内联函数

    在C++中使用内联函数来提高函数的性能。

    函数使得程序更易读、易维护,但是也增加了一下开销(压栈,函数切换的时间等)。使用内联函数可以避免函数调用的开销。其工作本质是:将函数中的代码复制到其调用点处。也就是说你看到的代码是有该函数的,但是在编译器里的代码是没有该函数的。

    内联函数的语法是在函数的返回值类型前面加一个关键字inline,如:

    #include <iostream>
    
    using namespace std;
    
    //内联函数
    inline void printArea(double radius) {
        cout << "area is " << radius*radius*3.14159 << endl;
    }
    
    int main()
    {
        double radius = 1;
        printArea(radius);
    
        printArea(4);
        return 0;
    }

    上面的代码在编译器中与下面的代码是一样的:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        double radius = 1;
        cout << "area is " << radius*radius*3.14159 << endl;
    
        cout << "area is " << 4*4*3.14159 << endl;
        return 0;
    }

    注意:内联函数适合短函数而非长函数。如果是长函数,编译器会忽略长函数的inline关键字,否则会使可执行代码变得很长。也就是说,inline只是向编译器提出一个请求,接不接受要看编译器。

    用引用的方式传参(按址传参)

    看下面代码,目的是交换两个变量的值:

    #include <iostream>
    
    using namespace std;
    
    void swap(int a, int b) {
        cout << "a is " << a << " and b is " << b << " before swapping " << endl;
        int temp = a;
        a = b;
        b = temp;
        cout << "a is " << a << " and b is " << b << " after swapping " << endl;
    }
    
    int main()
    {
        int a = 1, b = 2;
        swap(a, b);
    
        //实际结果
        cout << "In fact, a is " << a << " and b is " << b << " after swapping " << endl;
        return 0;
    }

    来看一下运行结果:

     可以看到,执行完swap函数之后,a与b并没有真正地交换。为什么呢?

    因为这个swap函数是按值传参的,也就是说,实参a,b传给形参a,b之后,实参a与形参a使用的是不同的地址空间,也就是说这两个a除了值相同,没有任何的关系(b同理),所以在交换形参a与b的时候,对实参没有任何影响。那么如何让a与b真正的交换呢?

    按址传参

    所谓按址传参,就是按照地址传递参数的意思,也就是说,这时候形参的地址与实参的地址相同,即这两个是同一个东西,形参相当于实参的别名(你可以类比人的大名和你的小名,虽然两者称呼不同,但是都指的是同一个人)。这样一来,交换就可以操作实参了。

    那么如何按址传参?很简单,在int后面加上"&"即可。关于符号"&",会在指针部分说到。

    #include <iostream>
    
    using namespace std;
    
    void swap(int& a, int& b) {
        cout << "a is " << a << " and b is " << b << " before swapping " << endl;
        int temp = a;
        a = b;
        b = temp;
        cout << "a is " << a << " and b is " << b << " after swapping " << endl;
    }
    
    int main()
    {
        int a = 1, b = 2;
        swap(a, b);
    
        //实际结果
        cout << "In fact, a is " << a << " and b is " << b << " after swapping " << endl;
        return 0;
    }

    如果你不想让本来的变量随意修改,那么可以用常数引用参数(数据类型前面加const关键字)

    如果把上面一段代码的swap函数的函数签名改成:swap(const int& a, const int& b),那么在执行时候就会报错,因为常数引用参数不可以更改。报错信息如下:

  • 相关阅读:
    python网络编程--线程GIL(全局解释器锁)
    python网络编程--进程线程
    html之块级标签h系列,div
    html之head,base,meta,title
    可视化SNV安装
    MySQLdb模块的安装
    python之os模块
    python之时间函数
    python之路之正则表达式
    python之路 之open
  • 原文地址:https://www.cnblogs.com/bwjblogs/p/12637877.html
Copyright © 2011-2022 走看看