2012-01-13 2 views
26

Можно создать дубликат:
What are the differences between pointer variable and reference variable in 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 & обычно означает адрес вар. Что это значит? Это причудливый способ обозначения указателя? Причина, по которой я предполагаю, что это нотация указателя, потому что это все-таки указатель, и мы проверяем равенство двух указателей. Спасибо.

+10

Без всякого неуважения, это будет рассмотрено в первых нескольких главах любой вводной книги на C++. Могу я предложить вам посоветоваться с ним? –

+0

Хорошо, я изучаю cplusplus.com, и у них есть этот пример. – infinitloop

+4

"* Я изучаю cplusplus.com *" Это ваша первая ошибка. Сайт не является хорошей ссылкой и ** особенно не ** хорошим учебным ресурсом. – ildjarn

ответ

33

Для начала, обратите внимание, что

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 находящегося разыменовывается. То есть вместо того, чтобы возвращать адрес памяти, верните объект, расположенный по этому адресу памяти.

+1

Действительно хорошо сломайте, спасибо. – tetris11

37

& имеет больше одного значения:

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 

п) другие ???

+4

И бит-мудрый * и * –

+1

Вопрос конкретный. Что это означает в коде в Q? –

+1

У меня нет ничего против downvotes, но я хотел бы знать, почему так, что я могу чему-то научиться. –

1

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

Смежные вопросы