【问题标题】:beginner reference type parameter confusion [duplicate]初学者参考类型参数混淆[重复]
【发布时间】:2011-10-06 17:05:15
【问题描述】:
foo(int &bar)
{
    bar = 5;
}

对这个函数的调用是

int foobar = 2;

foo(foobar);

我是否认为函数参数本质上是“获取”变量的内存地址,但不必在 foo 中取消引用,并且我会更改 foobar 的原始值?在此之前,我的印象是你必须像这样传递一个内存地址:

foo(&foobar);

然后像这样使用 foo 中的变量:

*bar = 5;

我认为这是错误的吗?我认为,像很多初学者一样,困惑来自于认为引用就像一个指针,因为它持有一个内存地址,但它从来都不是真正的类型,不是吗?只是一个运算符。

【问题讨论】:

  • foo(&bar){} 不是正确的 C++ 函数定义。
  • 不完全是,我不是对传递指针和作为引用传递之间的区别感到困惑,而是你如何使用“引用变量”可以这么说。

标签: c++


【解决方案1】:

引用通常使用底层指针实现(尽管标准没有强制要求),但它们与指针完全不同。引用只是现有变量的新名称或别名。当你这样做时

void foo(int& bar)
{
    bar = 5;
}

int foobar = 2;
foo(foobar);

您正在调用foo 以使用变量foobar 进行评估,因此基本上foo 中的bar 变为foobar。通常的编译器实现是像这样实际实现这段代码:

void foo(int* bar)
{
    *bar = 5;
}

int foobar = 2;
foo(&foobar);

【讨论】:

  • 那么只坚持指针参数是否更可接受的编码实践?
  • @SirYakalot:不,如果有的话,则相反。在语言中两者都有。
【解决方案2】:

如果你这样做了:

void foo(int& bar) { bar = 6; }

int main() {
    int x = 3;
    foo(x);
}

x in main 将等于 6。这是因为引用/别名(同一变量的不同名称)被传递到 foo。所以,函数 foo 中的 bar 和 main 中的 x 是同一个变量,同一个内存位置,等等。

这与正常的传递不同:

void foo(int bar) { bar = 6; }

int main() {
    int x = 3;
    foo(x);
}

其中 bar 将是从 main 中的 x 复制的新复制构造值(请注意,复制构造函数最好应用于非标量类型,但想法是相同的)。

最后,如果你这样做了:

void foo(int* bar) { *bar = 6; }

int main() {
    int x = 3;
    foo(&x);
}

对于 foo 的参数,它会说“我想要一个指向整数的指针”。在 main 中,我们获取“堆栈变量 x 的地址”,它本质上与指向 x 的指针相同,我们将它传递给 bar。然后取消引用 bar 并将 6 分配给它会使 main 中的 x 也等于 6 :)

【讨论】:

    猜你喜欢
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 2021-11-09
    • 2011-04-03
    • 2018-07-06
    相关资源
    最近更新 更多