2013-03-16 2 views
1

Мой вопрос относится к указателям с классами и ключевым словом this.Почему мы используем ссылочный оператор дважды?

class class1 { 
public: 
    bool isitme(class1& temp){ 
     if(this == &temp) 
      return true; 
     else return false; 
    } 
}; 


int main() { 
    class1 c3; 
    class1* c2 = &c3; 
    if(c3.isitme(*c2)) 
     cout << "c3 == c2"; //it is returning that 
    system("pause"); 
} 

Код выше работает, но то, что я не понимаю, почему это работает только тогда, когда bool isitme(class1& temp) и if(this == &temp) находятся в одной и той же функции isitme().

Я имею в виду, что мы уже читали блок памяти class1& temp temp в параметрах класса и должны иметь возможность сравнить этот блок памяти с ключевым словом this. Почему функция действует только тогда, когда я дважды получаю ссылку (this == &temp)?

Благодаря

ответ

4

this является указателем, тогда как temp является ссылкой. Когда вы пишете &temp в своем заявлении if, вы берете адрес temp. Это преобразует его в указатель, который затем можно сравнить с this.

+0

Так, если взять ссылку на ссылку, он преобразуется в указатель? – zurfyx

+1

@Rov Вы не принимаете ссылку на ссылку. Вы принимаете адрес объекта, переданного по ссылке. Temp не является ссылкой, temp является объектом, переданным по ссылке. – Etherealone

+0

О, я вижу, спасибо. Последний вопрос, зачем нам передавать его по ссылке? – zurfyx

1

Это было время, так как C/C++ дней, но позвольте мне принять удар на это ...

Вы не используете эталонный оператор дважды. Когда вы указываете class1&, вы указываете только тип параметра (тип «ссылка типа class1»), фактически ничего не делающего для temp. Позже вы фактически разыщите параметр с помощью &temp. Это только второй вид амперсанда, который на самом деле является ссылочным оператором.

0

Оператор & в декларации метода просто означает, что переданный объект не должен копироваться, а скорее указывать на то же место, что и объект, переданный ему (это ссылка). Оператор & в if(this == &temp) необходим, чтобы фактически получить адрес этого объекта (указатель), чтобы вы могли сравнить его с указателем this.

0

Ссылка «оператор» в сигнатуре метода isitme обозначает ссылку, то есть псевдоним для самого объекта.

С другой стороны, в строке if(this == &temp) оператор используется непосредственно на объект и, таким образом, возвращает адрес объекта (указатель на него).

Итак, если вы хотите проверить, совпадает ли введенная ссылка с номером this, вам нужно сравнить с указателем, который точно возвращает оператор ссылки.

0

& в списке параметров класса означает, что объект передается по ссылке. То есть, temp является псевдонимом для объекта class1. &temp просто берет адрес этого объекта и сравнивает его с объектом, на который указывает this. Два синтаксиса семантически разные, вы не принимаете адрес дважды.

2

Не путайте ссылочные объявления с использованием адреса оператора. Когда идентификатору & предшествует тип, такой как int или char, тогда идентификатор объявляется как ссылка на тип. Когда идентификатору & не предшествует тип, то используется адрес оператора-адреса.

Взято из: http://msdn.microsoft.com/en-us/library/w7049scy(v=vs.71).aspx

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