【问题标题】:Why pass by reference in c++ is denoted by functionName( dataType& variableName)?为什么 c++ 中的引用传递用 functionName(dataType& variableName) 表示?
【发布时间】:2019-02-23 06:57:32
【问题描述】:

在 C++ 中。当我们要定义一个指针变量时,语法是:

dataType* pointerVariable = &variableName;

这意味着pointerVariable是dataType-pointer类型,并且将variableName的地址存储在内存中。现在,当我们想要定义一个通过引用接受参数的函数时,语法是:

void functionName( dataType& argumentName );

而当我们要调用那个函数时,语法是:

functionaName( argumentName );

我的问题是,当我们想要定义一个通过引用接收参数的函数时,这意味着一个接收指针作为参数的函数,为什么我们不使用与定义指针相同的语法,像下面这样:

void functionName (dataType* argumentName);

然后,当我们要调用该函数时,语法是:

functionName(&argumentName);

为什么要修改新语法?

【问题讨论】:

  • 不幸的是,C++ creator 用完了运算符,所以他重用了 & 用于通过引用传递。但是引用和指针不是一回事。

标签: c++ pointers pass-by-reference


【解决方案1】:

当我们要定义一个通过引用接收参数的函数时,这意味着一个接收指针作为参数的函数

这是你的问题:你将语义与实现混淆了。

在 C++ 中作为引用的参数是作为引用的参数。就 C++ 而言,就是这样。它是一个引用参数,它的行为就像标准所说的引用参数的行为一样。

在编译器使用的 ABI 中实现可能涉及到传递一个指针。但这是编译器做什么的问题,而不是标准定义的 C++ 模型中发生的事情。

为什么我们不使用与定义指针相同的语法

因为它定义了一个接受指针的函数。

指针和引用不是一回事。指针变量可以在不同的时间指向不同的对象;引用变量不能。一旦引用绑定到一个对象,它就会一直绑定到那个对象,句号。

指针可以为 NULL。引用不能,或者至少,如果你做的事情会创建一个 NULL 引用,你已经调用了 UB,所以在那之后谈论程序的行为是没有意义的。以此类推。

然而,引用变量是在底层实现的,这些是 C++ 引用的规则,编译器必须遵守它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 2012-03-28
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多