• Index

定义函数

Reads: 34

既然用过std::abs()函数,那么,现在就以它为例,实现一个myabs()函数来实现求绝对值。

返回值类型 函数名称(参数类型 参数名称, 参数类型 参数名称)
{
    函数的内容
}

基础示例

根据这个格式实现myabs()函数:

#include <iostream>

int myabs(int num)
{
    int value = 0;
    if (num < 0)
    {
        value = -num;
    }
    else
    {
        value = num;
    }
    return value;
}

int main(void)
{
    std::cout << myabs(-1024) << std::endl;
    std::cout << myabs(2333) << std::endl;
    std::cout << myabs(6666) << std::endl;
    return 0;
}

输出结果:

1024
2333
6666

基础讲解

先看一下调用myabs()的时候跟调用std::abs()函数时是一样的。

然后再看看定义:

int myabs(int num)
{
    int value = 0;
    if (num < 0)
    {
        value = -num;
    }
    else
    {
        value = num;
    }
    return value;
}

myabs是函数的名称,myabs前面是返回值的类型,后面括号内是函数的参数,num是需要转成绝对值的值,它只接受int类型,所以调用就可以这样:

int absnum = myabs(-100);

上面代码中,函数参数num叫做形式参数;而传进去的参数-100叫做实际参数

形式参数实际上是一个局部变量,它的作用域就是在myabs()函数内。假设传入一个数值,上面代码函数的形式参数的行为是:int num = 100;,然后执行函数内的代码;假设传入一个变量value,那么形式参数的行为就是:int num = value;。也就是说,当有参数传入函数时,传入参数的行为就是一个赋值行为。所以,如果一个参数占用内存比较大,那就会导致大量数据被复制。

以下代码判断,如果num小于0就给它一个负号让它变成正数,然后再赋值给value;如果num非负则直接赋值给value

int value = 0;
if (num < 0)
{
    value = -num;
}
else
{
    value = num;
}

然后,myabs()函数返回计算结果,也就是变量value

return value;

当然啦,为了方便分析我做了一些拆分,实际上,myabs()函数可以简写成这样:

int myabs(int num)
{
    if (num < 0)
    {
        return -num;
    }
    else
    {
        return num;
    }
}

因为newnumint类型,所以返回值我就决定是int类型了。如果你觉得返回值肯定是非负的,那么你也是对的。所以,myabs()函数也可以写成这样:

unsigned int myabs(int num)
{
    if (num < 0)
    {
        return -num;
    }
    else
    {
        return num;
    }
}

再放一个含有多个参数的函数的栗子:

#include <iostream>

int add(int a, int b)
{
    return a + b;
}

int main(void)
{
    std::cout << add(-5, 100) << std::endl;
    return 0;
}

当然啦,单纯地相加就没必要写成函数了。

补充知识

在C++11前,为了减少函数返回值的额外开销,一般将非基本数据类型的类型(例如std::string)通过参数来返回。C++11开始,返回值直接返回不会带来额外的开销。因为返回变量时,编译器并不会销毁局部变量的内存而且还会将内存地址直接传递给保存返回值的变量。由于这个转变,使C++设计出来的函数更加直观地表达出其意义。而这个机制就叫做完美转发


Comments

Make a comment

  • Index

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.