我正在查看“关键字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( ¶m == 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( ¶m == this )
,那么¶m
的函数实现方式应该如何使用int isitme( CDummy param )
?
答案 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变量基本上是它引用的对象的别名(即,用户没有像指针那样明确地解除引用)。