为什么使用“&”在函数参数内

时间:2013-06-19 02:27:10

标签: c++

我正在查看“关键字this”下的c ++教程[http://www.cplusplus.com/doc/tutorial/classes2/],我对成员函数参数为什么有“&”感到困惑。

代码:

#include "stdafx.h"
#include <iostream>

class CDummy {
public:
    int isitme( CDummy& param );    // <-- Having trouble understanding this
};

int CDummy::isitme( CDummy& param )    // <-- Having trouble understanding this
{
    if( &param == this) 
        return true;
    else
        return false;
}

int main ()
{
    CDummy a;
    CDummy *b = &a;
    if ( b->isitme(a) )
        std::cout<< "yes, &a is b";

    return 0;   
}

为什么int isitme( CDummy& param)有效而非int isitme( CDummy param )?另外,如果函数声明为if( &param == this ),那么&param的函数实现方式应该如何使用int isitme( CDummy param )

2 个答案:

答案 0 :(得分:2)

这是一个参考。

通常,C ++是一种按值传递的语言,意味着副本被赋予功能。

通过使用&,您指定param变量是引用,几乎(a) 就像一个指针但不必担心间接。引用意味着您可以访问原始变量进行修改(如果需要)或(在这种情况下),以便您可以比较其地址。

如果您按值传递,您将获得一个具有不同地址的副本isitme()方法正在做的只是检查给定的CDummy变量是否是您正在调用该方法的变量,方法是按照以下代码检查它们的地址:

#include <iostream>

class CDummy {
public:
    int isitme (CDummy &x) {
        return &x == this;
    }
};

int main (void) {
    CDummy a, b;
    std::cout << a.isitme (a) << '\n';   // 1 = true
    std::cout << a.isitme (b) << '\n';   // 0 = false
    return 0;
}

输出是:

1
0

(a)主要区别在于引用引用实变量而指针可能为NULL。

答案 1 :(得分:1)

这是使用C ++左值引用语言功能将左值引用传递给函数,而不是像C中那样使用显式指针。由于引用必须绑定到对象,因此它们不能具有{{1 value ... reference-type变量基本上是它引用的对象的别名(即,用户没有像指针那样明确地解除引用)。