& rhs! = это, сравнить ссылку с указателем? - PullRequest
1 голос
/ 19 ноября 2011

это оператор присваивания.&rhs != this сбивает с толку.мои вопросы: rhs является ссылкой типа сообщения.Что означает &rhs?что делает & (адрес памяти ссылки?)?Другой вопрос о return *this.поскольку нам нужна ссылка на тип Message, но * это тип объекта Message, верно?Как мы можем вернуть объект по ссылке?

Message& Message::operator=(const Message &rhs)
{
    if (&rhs != this)
    {
         some functions;
    }
    return *this;
}

Ответы [ 3 ]

10 голосов
/ 19 ноября 2011

&rhs означает адрес объекта, на который ссылается ссылка.

Message a;
const Message &rhs = a;

if (&rhs == &a) std::cout << "true" << std::endl;

Это будет печатать true.

Ссылка не является другим объектом; это просто синтаксический сахар указателя, который указывает на тот же объект, чья ссылка на него. Поэтому, когда вы пишете return this, он возвращает указатель на объект, но если вы пишете return *this, он возвращает либо копию объекта, либо ссылку на объект в зависимости от типа возврата. Если тип возвращаемого значения Message &, то вы сообщаете компилятору, что « не делает копию, а вместо этого возвращает тот же объект ». Теперь тот же объект - это не что иное, как ссылка. Ссылка на объект может быть сделана в любое время. Например, см. Объявление rhs выше; это const Message & rhs = a, так как тип targer упоминается как ссылочный тип, вы делаете ссылку rhs на объект a. Это так просто.

4 голосов
/ 19 ноября 2011

Помимо Наваз отлично ответ , я хочу отметить, что вы должны быть осторожны с возвратом ссылки на локальную переменную, которая выйдет из области видимости после возврата функции , Поэтому не возвращайте ссылку, подобную этой:

string& foo()
{
    string result = "abc";
    return result;
}

, что вызывает следующее предупреждение компилятора:

ссылка на локальную переменную result возвращено

2 голосов
/ 19 ноября 2011

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

void f1(int a) { ++a; }
void f2(int & a { ++a; }

int main()
{
  int x = 5;
  f1(x); 
  f2(x);
}

Конечно, вы знаете разницу между этими двумя функциями.Но обратите внимание, что x всегда является просто объектом типа int.Передается ли это по ссылке или по значению, это не свойство x, а скорее функция.

То же самое относится и к типам возвращаемых данных:

int q;
int g1()   { return q; }
int & g2() { return q; }

int main()
{
  ++g2();
  ++g1(); // error
}

Опять же, q это просто объект.return q; возвращает его по значению или по ссылке - это не свойство q, а функция.g1 создает копию q, а g2 возвращает ссылку на фактический объект q (который мы можем увеличивать).(Возвращаемое значение g1 не может быть увеличено именно потому, что оно не имеет постоянного существования, и это было бы бессмысленно (технически это выражение является значением).)

Итак, в вашем примере, return *this; возвращает ссылку на сам объект.Это не имеет ничего общего с this, но имеет отношение к тому факту, что возвращаемый тип функции - Message&.

...