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++函数(二)
函数的重载
缺省参数
 内联函数
用引用的方式传参(按址传参)

 内联函数

在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;
}

来看一下运行结果:

C++函数(二)
函数的重载
缺省参数
 内联函数
用引用的方式传参(按址传参)

 可以看到,执行完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),那么在执行时候就会报错,因为常数引用参数不可以更改。报错信息如下:

C++函数(二)
函数的重载
缺省参数
 内联函数
用引用的方式传参(按址传参)