friend inline bool operator==(MonitorObjectString& lhs, MonitorObjectString& rhs) {
return(lhs.fVal==rhs.fVal);
}
назван friend definition
. Это определит функцию как функцию лица, не являющегося членом какой-либо организации, пространства имен, окружающего класс, в котором это появляется. На самом деле встроенное там избыточно: это неявно объявило встроенный, если это - друг определение. Некоторые за и против него:
MonitorObjectString
. Но это не хорошо и не плохо. Это зависит от ситуации. Например, если существуют функции getFVal()
, приобретение функционального друга довольно бессмысленно. Мог использовать getFVal
также тогда. я раньше любил этого друга стиль определения операторов, потому что они имеют прямой доступ к участникам класса и появляются в рамках определения класса - таким образом, у меня могло быть "все с одним видом". Недавно, однако, я пришел к выводу, что это - не всегда хорошая идея. Если Вы можете (и Вы должны) реализовывать оператор просто с помощью общедоступных функций членства класса, необходимо сделать его недругом (и лицо, не являющееся членом какой-либо организации) оператор, определенный в том же пространстве имен класса. Это удостоверяется, что, если Вы изменяете некоторую реализацию - но сохраняете интерфейс класса тем же - оператор будет все еще работать, и у Вас есть менее каскадные изменения, потому что Вы знаете, что это не может получить доступ к деталям реализации.
Однако , я предпочитаю этот стиль по записи членских операторов, потому что функции оператора в объеме пространства имен имеют дополнительные функции того, чтобы быть симметричным с их аргументами: Они не рассматривают особенную левую сторону, потому что обе стороны являются просто нормальными аргументами и не объектными аргументами, которые связываются с *this
. Если или левые или правая сторона имеют тип Вашего класса, другая сторона может быть неявно преобразована - независимо от того, лево ли это или право. Для функций, которые также определяются без друга синтаксис определения (традиционно в объеме пространства имен), у Вас будет функция выборочно включая заголовки, которые делают те операторы доступными или нет.
Они не являются взаимоисключающими. "друг" подразумевает, что функция лица, не являющегося членом какой-либо организации, может получить доступ к членам парламента, не занимающим официального поста класса. "встроенный" означает, что нет никакого вызова вызова функции, тело функции дублировано (в блоке) на каждом сайте вызова.
Грамматически разговор...
friend
ключевое слово все еще необходимо, чтобы сказать компилятору, что эта функция не является членом класса, РЕДАКТИРОВАНИЕ: , но вместо этого функция лица, не являющегося членом какой-либо организации, которая видит членов парламента, не занимающих официального поста класса.
Однако это, возможно, было реализовано более чисто как это:
/* friend */ inline bool operator ==(const MonitorObjectString& rhs) const
{ return fVal == rhs.fVal; }
(Конечно, я принимаю fVal
, имеет подходящий тип, который может быть сравнен, не влияя на его мыс константы.)