与号(&)在 c + + 中是如何工作的?

可能的复制品:
在 C + + 中,指针变量和引用变量有什么区别?

这让我很困惑:

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


int CDummy::isitme (CDummy& param)
{
if (&param == 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 & 中通常表示变量的地址。这是什么意思?这是一种奇特的指针表示法吗?

我之所以假设它是一个指针符号,是因为它毕竟是一个指针,我们正在检查两个指针是否相等。

我在 cplusplus.com 学习,他们有这个例子。

115010 次浏览

&有更多的单一含义:

取一个变量的地址

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

其他人呢?

声明为函数 CDummy::isitme参数的 CDummy& param实际上是一个 参考文献,它“像”一个指针,但是不同。关于引用需要注意的重要一点是,在作为参数传递的函数内部,实际上有一个对类型实例的引用,而不仅仅是一个指向它的指针。所以,在注释的那一行,‘ &’的功能就像 C 语言一样,它获取传入参数的地址,并将其与 this进行比较,当然,this是一个指向被调用方法的类的实例的指针。

首先,请注意

this

是指向其所在类的特殊指针(= = 内存地址)。 首先,实例化一个对象:

CDummy a;

接下来,实例化一个指针:

CDummy *b;

接下来,将 a的内存地址分配给指针 b:

b = &a;

接下来,方法 CDummy::isitme(CDummy &param)被调用:

b->isitme(a);

在这种方法中对测试进行评估:

if (&param == this) // do something

这就是棘手的地方。Param 是一个 CDmy 类型的对象,但是 &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解除引用。也就是说,不返回内存地址,而是返回位于该内存地址的对象。