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