Подтвердить что ты не робот

Как знак амперсанда (&) работает в С++?

Возможный дубликат:
Каковы различия между переменной указателя и ссылочной переменной в С++?

Это меня путает:

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 и обычно означает адрес var. Что это значит? Это причудливый способ обозначения указателя? Причина, по которой я предполагаю, что это нотация указателя, потому что это все-таки указатель, и мы проверяем равенство двух указателей. Спасибо.

4b9b3361

Ответ 1

Чтобы начать, обратите внимание, что

this

- специальный указатель (== адрес памяти) для класса, в котором он находится. Сначала создается экземпляр объекта:

CDummy a;

Затем создается экземпляр указателя:

CDummy *b;

Далее адрес памяти a присваивается указателю b:

b = &a;

Далее, метод CDummy::isitme(CDummy &param) вызывается:

b->isitme(a);

В этом методе оценивается тест:

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

Вот сложная часть. param является объектом типа CDummy, но &param является адресом памяти 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

& имеет больше значений:

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) другие

Ответ 3

Ну, CDummy& param, объявленный как параметр функции CDummy::isitme, фактически является reference, который "нравится" указатель, но другой. Важно отметить, что внутри функций, где они передаются как параметры, у вас действительно есть ссылка на экземпляр типа, а не "просто" указатель на него. Итак, в строке с комментарием "&" работает так же, как в C, он получает адрес переданного аргумента и сравнивает его с this, который, конечно, является указателем на экземпляр класса, на который вызывается метод.