【问题标题】:Why a reference is likely as an object?为什么引用可能是一个对象?
【发布时间】:2012-07-14 18:51:50
【问题描述】:

目前正在学习 c++,没有什么比向 S.O. 的专家提问更好的了。我找不到比这里更完整和更好的答案了。就这样吧。

DWORD dw = 5;
cout << &dw;

显示存储dw 值的地址。

但是为什么:

void Display(  DWORD &dwUserId )
{
    cout << dwUserId;
}

int _tmain( int argc, _TCHAR* argv[] )
{
    DWORD dw = 5;
    Display( dw );
} 

为什么在这个例子中显示dw的值而不是dw地址?

【问题讨论】:

标签: c++ const-reference


【解决方案1】:

&amp; 在这种情况下有两种不同的含义:

  • 放在声明中,表示变量是引用。在您的情况下,您通过引用传递参数。

  • 在声明之外,在变量之前,它获取它的地址。

除此之外,它还可以表示按位 AND 运算符

int x;
int& y = x;  //y is a reference to x
int* z = &x; //& takes the address of x and assigns it to z
y & x;       //bitwise AND

【讨论】:

  • 如果我将它正常传递给函数会发生什么? void Display( DWORD dwUserId )有什么区别?
  • @Amani 你不再传递一个引用,而是一个值,所以在函数内部你有一个原始的副本。查找传递引用与传递值。
  • 我明白了,我传递的不是dw,而是dw 的值。通过传递引用,我传递了对象本身,因此堆栈不会创建一个可以更快的副本,并且应该在不打算仅传递值时使用。
【解决方案2】:

DWORD &amp;dwUserId 作为函数的参数是对 DWORD 的引用

在 C++ 中,&amp; 运算符根据上下文做了两件事:

  • 在右值表达式中使用时,它返回值的地址。例如void* ptr = &amp;myObject;
  • 在类型说明符中使用时,它会将类型修改为“引用的”类型。这类似于引用在 Java 和 .NET 中的工作方式。例如int&amp; ref = myInt;

在您的情况下,您的 dwUserId 参数实际上是“对 DWORD 的引用”类型。

如果您想更改它以获取地址,请执行以下操作:

void Display(DWORD* userId) {
    cout << userId;
}

Display( &dw );

另外,请取消 TCHAR 类型。 MBCS 已弃用。 Win32 Unicode 和wchar_t 是未来:) 还要避免使用匈牙利符号。这不是 1980 年代。我们现在有 IDE。

【讨论】:

  • 它不仅做两件事,而且在声明中它不是操作符。看我的回答。
  • 该死,我忘了按位运算符了。
  • 我喜欢 80 年代的部分。 :)) +1
  • 不是TCHARtypedef wchar_t TCHAR吗? IDE 与匈牙利符号有什么关系?
  • @Amani TCHAR 仅在定义了 UNICODE 时才定义为 wchar_t
【解决方案3】:

因为当您在函数定义的参数名称前使用 & 符号时,您是在告诉编译器将该参数作为引用传递,即不要复制它。

当你在代码中某处的变量名之前使用它时,你是在告诉编译器使用变量地址而不是他的值。

【讨论】:

    猜你喜欢
    • 2019-05-11
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2019-01-09
    • 2021-02-12
    • 2021-02-20
    相关资源
    最近更新 更多