在C++中通过引用传递对象

KNU*_*KNU 27 c++ syntax class object

在C++(也是C)中通过引用传递变量的常用方法如下:

void _someFunction(dataType *name){ // dataType e.g int,char,float etc.
/****
definition
*/
}

int main(){
    dataType v;
    _somefunction(&v);  //address of variable v being passed
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但令我惊讶的是,我注意到在通过引用传递对象时,对象本身的名称起到了作用(不需要&符号),并且在声明/定义函数期间*,在参数之前不需要符号.以下示例应明确说明:

// this
#include <iostream>
using namespace std;

class CDummy {
  public:
    int isitme (CDummy& param);     //why not (CDummy* param);
};

int CDummy::isitme (CDummy& param)
{
  if (&param == this) return true;
  else return false;
}

int main () {
  CDummy a;
  CDummy* b = &a;
  if ( b->isitme(a) )               //why not isitme(&a)
    cout << "yes, &a is b";
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我有问题理解为什么这个特殊的待遇是用课堂完成的.即使是几乎像一个类的结构也不会以这种方式使用.对象名称是否被视为数组的地址?

key*_*ser 58

让你感到困惑的是,声明为引用传递(使用&)的函数不是使用实际地址调用的,即&a.

简单的答案是将函数声明为pass-by-reference:

void foo(int& x);
Run Code Online (Sandbox Code Playgroud)

是我们所需要的.然后它会自动通过引用传递.

你现在调用这个函数是这样的:

int y = 5;
foo(y);
Run Code Online (Sandbox Code Playgroud)

并将y通过引用传递.

你也可以这样做(但为什么会这样?咒语是:尽可能使用引用,需要时使用指针):

#include <iostream>
using namespace std;

class CDummy {
public:
    int isitme (CDummy* param);
};


int CDummy::isitme (CDummy* param)
{
    if (param == this) return true;
    else return false;
}

int main () {
    CDummy a;
    CDummy* b = &a;             // assigning address of a to b
    if ( b->isitme(&a) )        // Called with &a (address of a) instead of a
        cout << "yes, &a is b";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

yes, &a is b
Run Code Online (Sandbox Code Playgroud)

  • @Keyser是的,直到现在我认为只有这样才能声明一个函数(使用`*`)并调用它们(使用`&`)(通过引用来调用),如上面第一段代码所示.但你的答案对我来说是个开明的.100%满意. (4认同)
  • 等一下!你是个骗子吗?我正在收回我的投票! (2认同)

Mat*_*son 12

引用实际上是一个指针,有足够的糖使它味道很好......;)

但它也使用不同的指针语法,这使得使用引用比指针更容易.因此,我们&在调用带指针的函数时不需要- 编译器会为您处理.而且您不需要*获取引用的内容.

要调用引用,别名是一个非常准确的描述 - 它是"同一事物的另一个名称".因此,当a作为参考传递时,我们实际上是传递a,而不是副本a- 它是通过传递地址来完成的(内部)a,但是你不必担心它是如何工作的[除非你自己编写编译器,但是在编写自己的编译器时还需要​​了解许多其他有趣的事情,你不必担心何时编程].

请注意,引用对于intclass类型的工作方式相同.

  • “参考实际上是一个带有足够糖分的指针,使其味道鲜美”。我要把它打印出来,装裱起来然后挂在墙上:) (2认同)