Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 输入/输出参数以及如何在C++;_C++_Parameters - Fatal编程技术网

C++ 输入/输出参数以及如何在C++;

C++ 输入/输出参数以及如何在C++;,c++,parameters,C++,Parameters,在阅读不同类型的外部库中有关函数的文档时,我总是看到文档中的状态,即变量必须是[IN/OUT]。有人能给我一个关于[IN/OUT]如何与通过引用或值传递的函数参数相关的详细理解吗 下面是我遇到的一个函数示例,它告诉我它需要一个[IN/OUT]参数: 原型: ULONG GetActivationState(ULONG*PacActivationState) 参数 类型:ULONG* 变量:pActivationState 模式:输入/输出 如果参数为OUT,则必须通过引用进行传递。如果复制成本

在阅读不同类型的外部库中有关函数的文档时,我总是看到文档中的状态,即变量必须是[IN/OUT]。有人能给我一个关于[IN/OUT]如何与通过引用或值传递的函数参数相关的详细理解吗

下面是我遇到的一个函数示例,它告诉我它需要一个[IN/OUT]参数:

原型: ULONG GetActivationState(ULONG*PacActivationState)

参数

  • 类型:ULONG*
  • 变量:pActivationState
  • 模式:输入/输出

如果参数为OUT,则必须通过引用进行传递。如果复制成本太高,纯IN参数通常会通过值或常量引用进行传递(没有任何东西阻止设计人员通过引用进行传递,但这不是很好的设计IMHO)。IN/OUT参数必须通过引用传递。

通常,标记为IN/OUT的内容将通过非常量指针或引用传递,从而允许函数直接修改变量并读取它。一定要检查文档,看看它是否希望在传入之前设置该值

标记为IN的参数将通过值、常量指针或常量引用传递,从而禁止函数修改变量


C++不强制执行仅输出的参数,但通常会使用非常量指针或引用传递这些参数,类似于IN/OUT

此参数为in/out,因为您提供了一个在函数内部使用的值,函数会对其进行修改,以通知您函数内部发生的事情。此函数的用法如下所示:

ULONG activationState = 1; // example value
ULONG result = GetActivationState(&activationState);
ULONG GetActivationState(ULONG* pActivationState)
{
    if (*pActivationState == 1)
    {
    // do something
    // and inform by the modification of the variable, say, resetting it to 0
       *pActivationState = 0;
    }
    // ...
    return *pActivationState; // just an example, returns the same value
}
请注意,必须提供变量的地址,以便函数可以获取值并在函数外部设置值。例如,
GetActivationState
函数可以执行如下操作:

ULONG activationState = 1; // example value
ULONG result = GetActivationState(&activationState);
ULONG GetActivationState(ULONG* pActivationState)
{
    if (*pActivationState == 1)
    {
    // do something
    // and inform by the modification of the variable, say, resetting it to 0
       *pActivationState = 0;
    }
    // ...
    return *pActivationState; // just an example, returns the same value
}
请注意:

  • 函数接受参数作为指向UINT的非常量指针。这意味着它可以修改它
  • 函数可以通过取消引用来访问您给参数的值
  • 该函数可以通过取消引用来再次修改参数
  • 调用函数会看到
    activationState
    变量,该变量保存new值(在本例中为0)

  • 这是一个“通过引用”的例子,它是用C中的指针(也用C++中的引用)执行的。

    < P>可以使用值(简单类型)或常数引用<代码> const和< /> >以只输入参数。使用非常量引用
    &
    或指针
    *
    作为输入/输出参数来更改变量的值。您还可以使用指针引用
    *&
    来更改实际指针指向的地址(输入/输出)。正如指出的,C++中没有唯一的参数。

    这部分适用于所有类型的参数-大多数库接口都是C兼容的,所以通过指针传递参数更常见,而不是引用。 IN:当参数如中所示列出时,接口保证不会修改该参数。在我看来,最好将参数标记为
    const
    ,这样语言本身就可以防止对值进行修改。如果此参数是按值传递的,则无论它是否在文档中标记(或在原型中标记为const),都无关紧要,因为该参数无论如何都是函数的局部参数。但是为了避免复制,可以通过引用或指针传递,在这种情况下,
    const
    关键字变得非常重要

    OUT:标记出来的参数通常意味着传递给函数的参数值不重要。事实上,如果它是通过指针传递的,它甚至可能被要求为NULL,函数将分配内存并将值传递回给您


    输入/输出:输入/输出参数通常表示输入和输出值都有意义的内容。例如,如果您有一个填充缓冲区的库函数,它可能需要您传递一个指向缓冲区的指针,以及另一个指示缓冲区长度的指针。当函数返回时,第二个指针可能包含已写入缓冲区的实际字节数。

    对于in、out和in/out的使用,我的看法不一

    好处:正确完成后,它会将意图传达给文档的读者


    缺点:经常做得不好。这些名称显然不是语言的一部分;它们要么在注释中,要么在与代码分开维护的文档中。我见过太多的情况,其中一个参数被标记为“out”,但在代码中使用该参数所做的第一件事是将其用作右侧值。

    必须通过引用传递in/out参数。
    ;除了在发布的示例中,指针的传递参数是通过I/OUT参数传递的。@ PrAutoReIn:“通过引用”并不强制意味着签名使用C++引用参数。这意味着函数被授予对变量的写访问权,而不是变量值的副本。@AndréCaron我明白你的意思,但我不同意。如果这是C,我会使用术语“通过指针”和“通过引用”互换,但是用C++有区别,所以我觉得区别很重要。也许我只是吹毛求疵:-)@Praetorian。这种情况下的区别是语法上的,因为当通过指针传递参数时,指针必须指向有效对象。总之,大多数C++编译器都使用指针来实现引用。A.