【问题标题】:Passing by reference and by value通过引用和值传递
【发布时间】:2013-10-17 06:03:31
【问题描述】:

我们有函数

int foo(int x)
{
    return x;
}
int bar(int& x)
{
    return x;
}
...
foo(5);//ok
bar(5);//error

我不明白,当我们调用foo(5) 时会发生什么?内存中刚刚分配了4个字节并传输到foo?还是在分配 4 个字节后将创建此内存单元的副本并传输到foo

【问题讨论】:

  • 问题和代码似乎指的是两个不同的东西。问题的答案是 4 字节分配已在编译时完成。当您调用该函数时, foo 的参数值会在调用时复制到其中。代码的问题已经解释过了。

标签: c++ function parameter-passing


【解决方案1】:

功能栏将输入参数作为参考。这种用法的限制是在调用函数时不能将文字作为参数传递。

5 是文字。您不能将文字或表达式作为引用传递。此外,您的两个函数都返回整数,但您没有捕获它们。

函数 foo 按值接受输入。因此,制作并处理了输入变量的副本。函数内部的变量和外部的调用变量在这里是两个不同的变量。

更多信息可见http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

【讨论】:

  • 对不起,我不明白你的意思。为什么我们不能传递常量作为引用,但非常量可以传递?
  • @Dmitrii 查看我提到的链接。它应该可以澄清你的疑问。
  • 我意识到文字是非引用值,但实际上为此分配了内存。我们声明const int z=5; foo(z) 并崩溃了。我有两个疑问:在按值传递此文字后,我们是否有文字值的副本。每个 const 都只是字面意思吗?
  • @Dmitrii 像 '5' 这样的文字在内存中没有地址。它直接由编译器处理。当您将其作为参数传递给函数(按值)时,会在函数内部创建一个变量,其值初始化为 5。 const 本身不是文字。它是一个特殊的变量,它的值不能改变,但它可以像其他变量一样在整个程序中使用。
【解决方案2】:

除了其他答案中提供的信息外,我建议使用谷歌搜索 lvaluervalue

此外,想象一下这是可行的:

void bar(int& x)
{
  x = 6; // modify the referenced value, not some local variable!
}

main() {
  int y = 6;
  bar(5);

  printf ("equal or not: %s\n", (y==6?"yes":"no"));
}

运行这个程序应该是什么效果?

【讨论】:

    猜你喜欢
    • 2020-04-01
    • 2015-12-18
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2012-04-14
    • 2018-01-02
    相关资源
    最近更新 更多