C++函数进阶

一.内联函数

在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。

为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。

栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。

一个使用内联函数的示例程序如下:

#include 
#include 
#include 

inline double square(double x) {return x * x;}

int main()
{
    double a, b;
    double c = 13.0;

    a = square(5.0);
    b = square(4.5 + 7.5);

    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;

    return 0;
}

输出为

a = 25
b = 144

以下情况不宜使用内联:

(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。

(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。

二.引用

1.介绍

引用是已定义变量的别名。引用变量的主要用途是用作函数的形参,通过将引用变量用作参数,函数将使用原始数据,而不是其副本。

举例说明一下简单的应用

#include 
#include 
#include 

inline double square(double x) {return x * x;}

int main()
{
    int rats = 101;
    int &rodents = rats;

    std::cout << "rats = " << rats << std::endl;
    std::cout << "rodents = " << rodents << std::endl;

    rodents++;
    std::cout << "rats = " << rats << std::endl;
    std::cout << "rodents = " << rodents << std::endl;

    return 0;
}

输出为

rats = 101
rodents = 101
rats = 102
rodents = 102

2.将引用作为函数参数

示例程序

#include 
#include 
#include 

void swapr(int &a, int &b)
{
    int temp;

    temp = a;
    a = b;
    b = temp;
}

void swapp(int *a, int *b)
{
    int temp;
    
    temp = *a;
    *a = *b;
    *b = temp;
}

void swapv(int a, int b)
{
    int temp;
    
    temp = a;
    a = b;
    b = temp;
}

int main()
{
    int wallet1 = 300;
    int wallet2 = 350;

    swapr(wallet1, wallet2);
    swapp(&wallet1, &wallet2);
    swapv(wallet1, wallet2);

    return 0;
}

只有第三个按值传递是不可行的,数据没有被交换;因为变量a,b是复制了wallet1和wallet2的新变量,因此交换a和b不会影响wallet1和wallet2的值

3.默认参数

默认参数指的是当函数调用中省略了实参时自动使用的一个值。函数原型为

char *left(const char *str, int n = 3);

希望函数返回一个新的字符串,因此将其类型设置为char*(指向char的指针),希望原始字符串不变,因此使用了const,希望n的默认值为3,因此使用了n = 3。

当定义函数时:

int harpo(int n, int m = 4, int j = 5);      //合法

int chico(int n, int m = 6, int j);    //不合法

int groucho(int k = 1, int m = 2, int n = 3);    //合法

当使用函数时:

beeps = harpo(2);   //等价于harpo(2, 4, 5)

beeps = harpo(1, 8);   //等价于harpo(1, 8, 5)

beeps = harpo(8, 7, 6);   等价于harpo(8, 7, 6)

beeps = harpo(3, , 8);     //不合法,因为实参应从左到右依次赋值,不能跳过任何参数 

三.函数模板

#include 
#include 
#include 

template     //or class T
void swap(T &a, T &b)
{
    T temp; 
    temp = a;
    a = b;
    b = temp;
}

int main()
{
    int i = 10;
    int j = 20;

    swap(i, j);
    std::cout << "i = " << i << ", j = " << j << std::endl;

    double x = 24.3;
    double y = 66.8;
    swap(x, y);
    std::cout << "x = " << x << ", y = " << y << std::endl;

    return 0;
}

输出

i = 20, j = 10    
x = 66.8, y = 24.3

你可能感兴趣的:(c++,开发语言,算法)