当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ Functions用法及代码示例


函数是一组接受输入、执行某些特定计算的语句, 并产生输出。这个想法是把一些常见的或重复的 一起完成任务以制作函数这样我们就可以调用这个函数,而不是为不同的输入一次又一次地编写相同的代码。
简单来说,函数是仅在被调用时运行的代码块。

用法:

Syntax of Function

函数语法

例子:

C++


// C++ Program to demonstrate working of a function
#include <iostream>
using namespace std;
// Following function that takes two parameters 'x' and 'y'
// as input and returns max of two input numbers
int max(int x, int y)
{
    if (x > y)
        return x;
    else
        return y;
}
// main function that doesn't receive any parameter and
// returns integer
int main()
{
    int a = 10, b = 20;
    // Calling above function to find max of 'a' and 'b'
    int m = max(a, b);
    cout << "m is " << m;
    return 0;
}
输出
m is 20

时间复杂度:O(1)

空间复杂度:O(1)

为什么我们需要函数?

  • 函数可以帮助我们减少代码冗余。如果函数在软件中的多个位置执行,那么我们不必一次又一次地编写相同的代码,而是创建一个函数并在各处调用它。这也有助于维护,因为如果我们将来更改函数,我们只需在一处进行更改。
  • 函数生成代码模块化的。考虑一个包含多行代码的大文件。如果代码被分成函数,那么阅读和使用代码就会变得非常简单。
  • 函数提供抽象。例如,我们可以使用库函数而不用担心它们的内部工作。

函数声明

函数声明告诉编译器参数的数量、参数的数据类型以及函数的返回类型。在函数声明中写入参数名称是可选的,但必须将它们放在定义中。下面是函数声明的示例。 (以下声明中不存在参数名称)

Function Declaration in C++

函数声明

例子:

C++


// C++ Program to show function that takes
// two integers as parameters and returns
// an integer
int max(int, int);
// A function that takes an int
// pointer and an int variable
// as parameters and returns
// a pointer of type int
int* swap(int*, int);
// A function that takes
// a char as parameter and
// returns a reference variable
char* call(char b);
// A function that takes a
// char and an int as parameters
// and returns an integer
int fun(char, int);

函数类型

Types of Function in C++

C++ 中的函数类型

用户定义函数

用户定义函数是 user/customer-defined 专门定制的代码块,以降低大程序的复杂性。它们也被俗称为“tailor-made函数” 的构建只是为了满足用户面临问题的情况,同时降低整个程序的复杂性。

库函数

库函数也称为“内置函数”。这些函数是已定义的编译器包的一部分,由具有特殊和不同含义的特殊函数组成。内置函数为我们提供了一个优势,因为我们可以直接使用它们而无需定义它们,而在用户定义函数中我们必须在使用它们之前声明并定义一个函数。
例如:sqrt()、setw()、strcat()等

参数传递给函数

传递给函数的参数被调用实际参数。例如,在下面的程序中,5和10是实际参数。
函数接收到的参数被调用形式参数。例如,在上面的程序中,x和y是形式参数。

Formal Parameter and Actual Parameter in C++

形式参数和实际参数

有两种最流行的参数传递方式:

  1. 按值传递:在这种参数传递方法中,实际参数的值被复制到函数的形式参数中。实际参数和形式参数存储在不同的内存位置,因此函数中所做的任何更改都不会反映在调用者的实际参数中。
  2. 通过参考传递:实际参数和形式参数都引用相同的位置,因此函数内部所做的任何更改都会反映在调用者的实际参数中。

函数定义

按值传递用于未使用函数 fun() 修改 x 值的情况。

C++


// C++ Program to demonstrate function definition
#include <iostream>
using namespace std;
void fun(int x)
{
    // definition of
    // function
    x = 30;
}
int main()
{
    int x = 20;
    fun(x);
    cout << "x = " << x;
    return 0;
}
输出
x = 20

时间复杂度:O(1)

空间复杂度:O(1)

使用指针的函数

函数 fun() 需要一个指向整数(或整数的地址)的指针 ptr。它修改地址 ptr 处的值。解引用运算符*用于访问地址处的值。在语句‘*ptr = 30’中,地址ptr处的值变为30。地址运算符&用于获取任何数据类型的变量的地址。在函数调用语句‘fun(&x)’中,传递了x的地址,以便可以使用它的地址来修改x。

C++


// C++ Program to demonstrate working of
// function using pointers
#include <iostream>
using namespace std;
void fun(int* ptr) { *ptr = 30; }
int main()
{
    int x = 20;
    fun(&x);
    cout << "x = " << x;
    return 0;
}
输出
x = 30

时间复杂度:O(1)

空间复杂度:O(1)

C++ 中按值调用和按引用调用的区别

按值调用 通过参考调用
该值的副本被传递给函数 值的地址被传递给函数
函数内部所做的更改不会
反映在其他职能上
函数内部所做的更改会得到反映
也在函数之外
实际和正式的论点将在
不同的内存位置
实际和正式的论点将在
相同的内存位置。

关于 C++ 中的函数需要记住的要点

1. 大多数 C++ 程序都有一个名为 main() 的函数,当用户运行程序时操作系统会调用该函数。

2.每个函数都有一个返回类型。如果函数不返回任何值,则使用 void 作为返回类型。此外,如果函数的返回类型是void,我们仍然可以在函数定义体中使用return语句,只要不指定任何常量、变量等,只需提及“return;”语句即可象征着函数的终止,如下图:

C++


void function name(int a)
{
    ....... // Function Body
        return; // Function execution would get terminated
}

3.要声明一个只能在没有任何参数的情况下调用的函数,我们应该使用“无效的乐趣(无效)”。附带说明一下,在 C++ 中,空列表意味着只能在不带任何参数的情况下调用函数。在 C++ 中,void fun() 和 void fun(void) 是相同的。

主函数

main函数是一个特殊函数。每个 C++ 程序都必须包含一个名为 main 的函数。它作为程序的入口点。计算机将从 main 函数的开头开始运行代码。

主要函数类型

1. 不带参数:

CPP


// Without Parameters
int main() { ... return 0; }

2.带参数:

CPP


// With Parameters
int main(int argc, char* const argv[]) { ... return 0; }

main函数有参数选项的原因是为了允许从命令行输入。当您使用带有参数的 main 函数时,它将程序名称后面的每组字符(以空格分隔)保存为名为的数组中的元素精液.
由于 main 函数的返回类型为int,程序员必须始终在代码中包含 return 语句。返回的数字用于通知调用程序该程序的执行结果是什么。返回 0 表示没有问题。

C++ 递归

当函数在同一个函数内调用时,在 C++ 中称为递归。调用同一个函数的函数称为递归函数。
调用自身并且在函数调用后不执行任何任务的函数称为尾递归。在尾递归中,我们通常使用 return 语句调用相同的函数。
用法:

C++


recursionfunction()
{
    recursionfunction(); // calling self function
}

想了解更多请看本文.

C++ 将数组传递给函数

在 C++ 中,为了重用数组逻辑,我们可以创建一个函数。要将数组传递给 C++ 中的函数,我们只需提供数组名称。

function_name(array_name[]); //passing array to function

示例:打印给定数组中的最小数字。

C++


#include <iostream>
using namespace std;
void printMin(int arr[5]);
int main()
{
    int ar[5] = { 30, 10, 20, 40, 50 };
    printMin(ar); // passing array to function
}
void printMin(int arr[5])
{
    int min = arr[0];
    for (int i = 0; i < 5; i++) {
        if (min > arr[i]) {
            min = arr[i];
        }
    }
    cout << "Minimum element is: " << min << "\n";
}
// Code submitted by Susobhan Akhuli
输出
Minimum element is: 10

时间复杂度:O(n) 其中 n 是数组的大小
空间复杂度:O(n),其中 n 是数组的大小。

C++ 重载(函数)

如果我们创建两个或多个具有相同名称但参数数量或类型不同的成员,则称为 C++ 重载。在C++中,我们可以重载:

  • 方法,
  • 构造函数和
  • 索引属性

C++ 中的重载类型有:

  • 函数重载
  • 运算符重载

C++ 函数重载

函数重载被定义为具有相同名称但不同参数的两个或多个函数的过程。在函数重载中,通过使用不同类型或数量的参数来重新定义函数。只有通过这些差异,编译器才能区分函数。
函数重载的优点是它增加了程序的可读性,因为您不需要对同一操作使用不同的名称。

示例:更改 add() 方法的参数数量

C++


// program of function overloading when number of arguments
// vary
#include <iostream>
using namespace std;
class Cal {
public:
    static int add(int a, int b) { return a + b; }
    static int add(int a, int b, int c)
    {
        return a + b + c;
    }
};
int main(void)
{
    Cal C; // class object declaration.
    cout << C.add(10, 20) << endl;
    cout << C.add(12, 20, 23);
    return 0;
}
// Code Submitted By Susobhan Akhuli
输出
30
55

时间复杂度:O(1)
空间复杂度:O(1)

示例:当参数类型不同时。

C++


// Program of function overloading with different types of
// arguments.
#include <iostream>
using namespace std;
int mul(int, int);
float mul(float, int);
int mul(int a, int b) { return a * b; }
float mul(double x, int y) { return x * y; }
int main()
{
    int r1 = mul(6, 7);
    float r2 = mul(0.2, 3);
    cout << "r1 is : " << r1 << endl;
    cout << "r2 is : " << r2 << endl;
    return 0;
}
// Code Submitted By Susobhan Akhuli
输出
r1 is : 42
r2 is : 0.6

时间复杂度:O(1)
空间复杂度:O(1)

函数重载和二义性

当编译器无法决定在重载函数中调用哪个函数时,这种情况称为函数重载歧义。
当编译器显示歧义错误时,编译器不会运行该程序。

歧义的原因:

  • 类型转换。
  • 具有默认参数的函数。
  • 与pass-by-reference 一起使用。

类型转换:-

C++


#include <iostream>
using namespace std;
void fun(int);
void fun(float);
void fun(int i) { cout << "Value of i is : " << i << endl; }
void fun(float j)
{
    cout << "Value of j is : " << j << endl;
}
int main()
{
    fun(12);
    fun(1.2);
    return 0;
}
// Code Submitted By Susobhan Akhuli

上面的例子显示了一个错误“重载的“fun(double)”的调用不明确”。 fun(10) 将调用第一个函数。 fun(1.2) 根据我们的预测调用第二个函数。但是,这并不像 C++ 中那样引用任何函数,所有浮点常量都被视为 double 而不是 float。如果我们将 float 替换为 double,程序就可以运行。因此,这是从float到double的类型转换。

带默认参数的函数:-

C++


#include <iostream>
using namespace std;
void fun(int);
void fun(int, int);
void fun(int i) { cout << "Value of i is : " << i << endl; }
void fun(int a, int b = 9)
{
    cout << "Value of a is : " << a << endl;
    cout << "Value of b is : " << b << endl;
}
int main()
{
    fun(12);
    return 0;
}
// Code Submitted By Susobhan Akhuli

上面的例子显示了一个错误“重载的“fun(int)”的调用不明确”。 fun(int a, int b=9) 可以通过两种方式调用:第一种是使用一个参数调用函数,即 fun(12),另一种方法是使用两个参数调用函数,即 fun (4,5)。 fun(int i) 函数通过一个参数调用。因此,编译器无法在 fun(int i) 和 fun(int a,int b=9) 之间进行选择。

通过引用传递的函数:-

C++


#include <iostream>
using namespace std;
void fun(int);
void fun(int&);
int main()
{
    int a = 10;
    fun(a); // error, which fun()?
    return 0;
}
void fun(int x) { cout << "Value of x is : " << x << endl; }
void fun(int& b)
{
    cout << "Value of b is : " << b << endl;
}
// Code Submitted By Susobhan Akhuli

上面的例子显示了一个错误“重载的“fun(int&)”调用不明确”。第一个函数采用一个整数参数,第二个函数采用引用参数作为参数。在这种情况下,编译器不知道用户需要哪个函数,因为 fun(int) 和 fun(int &) 之间没有语法差异。

好友函数

  • 友元函数是 C++ 中的一种特殊函数,尽管它不是类的成员函数,但它具有访问类的私有和受保护数据的特权。
  • 友元函数是类的非成员函数或普通函数,在类内部使用关键字“friend”声明。通过将函数声明为友元,所有访问权限都授予该函数。
  • 关键字“friend”仅放置在函数声明中,而不放置在函数定义中。
  • 当调用友元函数时,既不使用对象名称,也不使用点运算符。但是,它可以接受对象作为要访问其值的参数。
  • 友元函数可以在类的任何部分声明,即公共、私有或受保护的。

C++中友元函数的声明

用法:

class <class_name> {    
friend <return_type> <function_name>(argument/s);
};

示例_1:使用 Friend 函数求两个数中最大的一个

C++


#include <iostream>
using namespace std;
class Largest {
    int a, b, m;
public:
    void set_data();
    friend void find_max(Largest);
};
void Largest::set_data()
{
    cout << "Enter the first number : ";
    cin >> a;
    cout << "\nEnter the second number : ";
    cin >> b;
}
void find_max(Largest t)
{
    if (t.a > t.b)
        t.m = t.a;
    else
        t.m = t.b;
    cout << "\nLargest number is " << t.m;
}
int main()
{
    Largest l;
    l.set_data();
    find_max(l);
    return 0;
}

输出

Enter the first number : 789
Enter the second number : 982
Largest number is 982



相关用法


注:本文由纯净天空筛选整理自佚名大神的英文原创作品 Functions in C++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。