如何在 C++ 中从不同函数访问局部变量

2024年8月29日 | 阅读 8 分钟

解决 C++ 中从不同函数检索局部变量非常重要,它是程序变量作用域、函数调用和数据共享的核心。在 C++ 中,局部变量只能在代码的特定块内声明,通常是在特定函数的正文中,从而将其作用域限制在该块内。

此外,有时会发生需要从另一个函数获取局部变量值的情况。此类需求可能包括传递数据,执行操作或在程序的不同部分交换信息。

按引用传递:通过将局部变量作为引用参数传递给另一个函数来实现,从而使该函数能够直接修改变量。

返回值:通过这种方式,包含局部变量的函数会返回其值,然后由调用函数捕获。

静态局部变量:预定义的静态局部变量在多次函数调用中保持其值,从而允许数据在函数调用之间共享。

全局变量:尽管出于封装和可维护性等原因不推荐这样做,但声明一个全局变量允许程序中的任何函数访问它。

每种方法的含义都涉及代码结构、数据封装程序设计。选择合适的方法需要仔细研究,以考虑期望的行为类型、与数据的连接程度以及程序的整体结构。此外,遵守消除全局变量并采用封装和信息隐藏的最佳实践政策对于维护代码质量和可读性至关重要。

引用传递

函数通过引用而不是值来传递局部变量的值。它为函数提供了对变量内存位置的直接访问。因此,函数可以立即修改原始变量。以下是详细解释:

程序

输出

Original value of localVar: 10
Modified value of localVar: 20

说明

  • 函数声明

有一个名为“modifyValue”的函数,带有一个参数。此参数使用 ampersand (&) 表示。它是一个表示引用参数的语句。在 modifyValue 函数内部,我们直接修改参数的值。由于参数是引用的,函数内部发生的任何事情都将修改传递给它的原始变量。

  • 主函数

我们声明一个局部变量localVar,然后将其值赋为 10。接下来,我们输出局部变量的值。当我们引用 localVar 作为参数时,这会修改函数。这会将变量按引用传递给函数。我们现在将 localVar 重新赋值为适当的值。

  • 输出

执行程序后,输出将打印localVar的旧值和localVar的新值。

最后,此代码显示了通过引用将局部变量传递给函数的原理。通过将按引用传递原则应用于变量,函数内部对其所做的更改会更改在 main 函数中声明的值,而无需生成新副本。

复杂度分析

引用传递

函数通过引用而不是值传递局部变量的值。它为函数提供了对变量内存位置的直接访问。因此,函数可以立即修改原始变量。以下是详细解释:

在 C++ 中,您可以通过在函数参数声明中的变量名称前添加“&”符号来指示您正在获取变量的引用而不是其值。

时间复杂度

该代码的时间复杂度是直接的,因为它只包含简单的操作,没有循环或递归调用

此算法的运行时间为O(1),这意味着它与输入大小和所有其他参数无关。

空间复杂度

代码的空间复杂度主要取决于变量使用的内存利用率以及函数调用带来的任何额外开销。

在 main 函数中,声明了一个单独的整数变量localVar,它总是消耗相同的内存量,与输入大小无关。因此,它的空间复杂度为O(1)

modifyValue 函数内,没有创建新变量。唯一的内存使用是引用参数localVar,它同样需要恒定的内存量。

总的来说,代码的空间复杂度为O(1),这意味着恒定空间利用率,不受输入大小或其他因素的影响。

返回值

通过实现一个函数,包括计算或修改局部变量值的代码,然后将其返回给调用函数,可以实现在一个函数中更改局部变量的值并在另一个函数中使用它。

程序

输出

Returned value from computeValue function: 10

说明

  • 函数声明和定义(computeValue)

我们调用一个名为 computeValue 的函数,该函数返回一个整数值作为输出。在函数内部,我们声明一个局部变量 localVar,值为 10。接下来,我们使用return 语句将值重定向到 localVar。

  • 主函数

在 main 函数中,我们调用computeValue 函数。我们将返回的值赋给一个结果字符串。此外,我们将计算机函数的值作为我们的输出。

当 main 作为静态函数调用实例方法computeValue时,它计算局部变量localVar的值并返回它。然后将此计算结果设置为 main 函数中 result 变量的值;因此,该值可用于 main 函数中或任何其他函数中的其他位置。

这种方法允许信息直接从一个函数发送到另一个函数,而无需正式的参数将共享数据作为函数参数传递,使代码模块化且更易于理解。另一方面,应该补充的是,会创建局部变量值的副本,如果数据类型很大,这可能会影响函数的工作速度。

复杂度分析

时间复杂度

代码的时间复杂度由函数中执行的操作定义。这里同样只包含变量初始化和 return 语句,它们都以恒定时间执行。恒定时间不受输入大小或任何其他因素的影响。

同样,main 函数包含简单的操作:调用 computeValue 函数,该函数提供并使用返回值。这些过程在恒定的时间内运行。

因此,代码的 big O 符号为O(1),这意味着无论输入大小或任何其他因素或并发症如何,都将具有恒定的时间复杂度。

空间复杂度

代码的内存由变量的大小和软容量的大小决定。

通过定义一个单独的整数变量 local art,它占用固定量的内存,无论输入面板大小如何,computeValue 函数的开销近似恒定。但是,具有恒定的空间复杂度O(1),它提供了相同的结果。

在 main 函数中,为存储返回值(result)以及可能作为函数调用开销调用的任何变量分配了更多内存。尽管如此,这些内存密集型变量的读写操作涉及 O(1) 空间复杂度。

总的来说,代码的空间复杂度为 O(1);恒定空间的使用不取决于输入大小或正在使用的任何因素。

静态局部变量

在 C++ 函数中被指定为静态的变量会在函数调用之间保留其值;因此,它会在函数调用之间保留其值。这些数组使用的内存资源较少,并且相同的内存地址包含对数组对象的引用。相反,常规局部变量在每次函数调用期间被创建和初始化,但具有不同的内存地址。

程序

输出

Function called 1 times
Function called 2 times
Function called 3 times

说明

  • 函数定义(myFunction)

在函数myFunction内部,声明了一个内部局部变量 count 并初始化为 0。顾名思义,它是一个在其值在函数调用之间保持的变量。每次使用 myFunction 时,count(作为数组元素)的值都会增加 1。有一个函数打印它被调用的次数。

  • 主函数

中间函数 main 函数连续三次调用 myFunction。但是,当调用 myFunction 时,计数器变量会增加,这个数字反映了 myFunction 被调用的次数。

  • 输出

当程序显示输出时,它包含消息,每条消息代表 myFunction 函数被调用的次数。因为 count 静态变量在函数调用后存储其值,所以输出显示了每次连续函数调用 myFunction 时获得的计数。

最后,突出显示的函数myFunction 操作包括其中静态局部变量 count 的用法。通过使用此变量来实现此步骤,该变量在函数调用之间保留其值,从而帮助函数实现跨多次执行的状态。每次调用函数时,count 都会递增,从而给出显示函数被使用了多少次的结果。

复杂度分析

时间复杂度

代码的时间复杂度取决于 myFunction 和 main 函数内部的计算操作。

myFunction 函数内,与静态变量 count 相关的操作在恒定时间内完成。然而,输出操作(std::cout)需要恒定的时间。通过依次调用 myFunction 一次和三次,在 myFunction 内部执行了上述功能的三个实例。

因此,函数调用的次数是时间复杂度 O (1) 的组成部分。整个程序被归类为O (1) * 3 = O (3),可以简化为O (1)

空间复杂度

代码的空间复杂度可以通过变量的内存使用情况以及每次函数调用的开销需求来定义。

myFunction 函数的定义中,我们定义了一个静态(因此,相对“大”的)局部变量 count,它占用的内存空间与输入大小或函数调用的次数无关。因此,此算法的复杂度为O(1)

在 main 函数中,除了可以调用函数开销的临时变量外,没有声明额外变量的语句,这使得空间复杂度为恒定

代码的内存空间是恒定的,因此空间需求不取决于输入大小或所需的函数调用次数。