可能重复:
What are the differences between pointer variable and reference variable in C++?
这令我感到困惑:
class CDummy
{
public:
int isitme (CDummy& param);
};
int CDummy::isitme (CDummy& param)
{
if (¶m == this)
{
return true; //ampersand sign on left side??
}
else
{
return false;
}
}
int main ()
{
CDummy a;
CDummy* b = &a;
if ( b->isitme(a) )
{
cout << "yes, &a is b";
}
return 0;
}
在C&amp;通常表示var的地址。这是什么意思?这是指针符号的奇特方式吗?
我假设它是一个指针表示法的原因,因为这毕竟是一个指针,我们正在检查两个指针的相等性。
我正在从cplusplus.com学习,他们有这个例子。
答案 0 :(得分:59)
&
有更多的含义:
1)取一个变量的地址
int x;
void* p = &x;
//p will now point to x, as &x is the address of x
2)通过引用函数传递参数
void foo(CDummy& x);
//you pass x by reference
//if you modify x inside the function, the change will be applied to the original variable
//a copy is not created for x, the original one is used
//this is preffered for passing large objects
//to prevent changes, pass by const reference:
void fooconst(const CDummy& x);
3)声明一个引用变量
int k = 0;
int& r = k;
//r is a reference to k
r = 3;
assert( k == 3 );
4)按位和运算符
int a = 3 & 1; // a = 1
n)其他人???
答案 1 :(得分:44)
首先,请注意
this
是一个特殊的指针(==内存地址)。 首先,实例化一个对象:
CDummy a;
接下来,实例化一个指针:
CDummy *b;
接下来,将a
的内存地址分配给指针b
:
b = &a;
接下来,调用方法CDummy::isitme(CDummy ¶m)
:
b->isitme(a);
在此方法中评估测试:
if (¶m == this) // do something
这是棘手的部分。 param是CDummy类型的对象,但¶m
是param的内存地址。因此,param的内存地址将针对另一个名为“this
”的内存地址进行测试。如果将此方法的对象的内存地址复制到此方法的参数中,则会生成true
。
这种评估通常在重载复制构造函数
时完成MyClass& MyClass::operator=(const MyClass &other) {
// if a programmer tries to copy the same object into itself, protect
// from this behavior via this route
if (&other == this) return *this;
else {
// otherwise truly copy other into this
}
}
另请注意*this
的使用情况,其中this
已取消引用。也就是说,不是返回内存地址,而是返回位于该内存地址的对象。
答案 2 :(得分:2)
声明为函数CDummy& param
的参数的CDummy::isitme
实际上是reference,它与指针“相似”,但不同。关于引用的重要注意事项是它们作为参数传递的内部函数,你实际上有一个对类型实例的引用,而不是“只是”指向它的指针。所以,就评论而言,'&amp;'就像在C中一样,它正在获取传入的参数的地址,并将它与this
进行比较,当然,{{1}}是指向调用该方法的类实例的指针。