друг И встроенный метод, какой смысл?

18
задан pyrrhic 3 July 2017 в 18:57
поделиться

3 ответа

friend inline bool operator==(MonitorObjectString& lhs, MonitorObjectString& rhs) { 
    return(lhs.fVal==rhs.fVal); 
}

назван friend definition. Это определит функцию как функцию лица, не являющегося членом какой-либо организации, пространства имен, окружающего класс, в котором это появляется. На самом деле встроенное там избыточно: это неявно объявило встроенный, если это - друг определение. Некоторые за и против него:

  • Это делает оператор не видимым к нормальному поиску. Единственным путем можно звонить, это использует зависимый поиск аргумента. Это сохранит пространство имен свободным от большого количества объявлений оператора видимый обычно. Обратите внимание, что это также отключит способность вызова его с помощью неявных преобразований в MonitorObjectString (потому что, если оба типа аргумента не соответствуют во время поиска кандидатов, чтобы быть названными, зависимый поиск аргумента не найдет функцию).
  • поиск для имен запускает в пределах класса друга, в котором появляется определение. Это означает, что никакие долгие имена типов или другие имена не должны быть выписаны. Просто отошлите их, как Вы были бы в нормальной функции членства класса.
  • , Поскольку это - друг, функция видит внутренности MonitorObjectString. Но это не хорошо и не плохо. Это зависит от ситуации. Например, если существуют функции getFVal(), приобретение функционального друга довольно бессмысленно. Мог использовать getFVal также тогда.

я раньше любил этого друга стиль определения операторов, потому что они имеют прямой доступ к участникам класса и появляются в рамках определения класса - таким образом, у меня могло быть "все с одним видом". Недавно, однако, я пришел к выводу, что это - не всегда хорошая идея. Если Вы можете (и Вы должны) реализовывать оператор просто с помощью общедоступных функций членства класса, необходимо сделать его недругом (и лицо, не являющееся членом какой-либо организации) оператор, определенный в том же пространстве имен класса. Это удостоверяется, что, если Вы изменяете некоторую реализацию - но сохраняете интерфейс класса тем же - оператор будет все еще работать, и у Вас есть менее каскадные изменения, потому что Вы знаете, что это не может получить доступ к деталям реализации.

Однако , я предпочитаю этот стиль по записи членских операторов, потому что функции оператора в объеме пространства имен имеют дополнительные функции того, чтобы быть симметричным с их аргументами: Они не рассматривают особенную левую сторону, потому что обе стороны являются просто нормальными аргументами и не объектными аргументами, которые связываются с *this. Если или левые или правая сторона имеют тип Вашего класса, другая сторона может быть неявно преобразована - независимо от того, лево ли это или право. Для функций, которые также определяются без друга синтаксис определения (традиционно в объеме пространства имен), у Вас будет функция выборочно включая заголовки, которые делают те операторы доступными или нет.

41
ответ дан 30 November 2019 в 06:14
поделиться

Они не являются взаимоисключающими. "друг" подразумевает, что функция лица, не являющегося членом какой-либо организации, может получить доступ к членам парламента, не занимающим официального поста класса. "встроенный" означает, что нет никакого вызова вызова функции, тело функции дублировано (в блоке) на каждом сайте вызова.

7
ответ дан 30 November 2019 в 06:14
поделиться

Грамматически разговор...

friend ключевое слово все еще необходимо, чтобы сказать компилятору, что эта функция не является членом класса, РЕДАКТИРОВАНИЕ: , но вместо этого функция лица, не являющегося членом какой-либо организации, которая видит членов парламента, не занимающих официального поста класса.

<час>

Однако это, возможно, было реализовано более чисто как это:

/* friend */ inline bool operator ==(const MonitorObjectString& rhs) const
{ return fVal == rhs.fVal; }

(Конечно, я принимаю fVal, имеет подходящий тип, который может быть сравнен, не влияя на его мыс константы.)

6
ответ дан 30 November 2019 в 06:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: